identity_iota_interaction/
move_type.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2020-2025 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0

use crate::types::base_types::IotaAddress;
use crate::types::base_types::ObjectID;
use crate::types::TypeTag;
use crate::IotaVerifiableCredential;
use serde::Serialize;

pub enum TypedValue<'a, T: MoveType> {
  IotaVerifiableCredential(&'a IotaVerifiableCredential),
  Other(&'a T),
}

/// Trait for types that can be converted to a Move type.
pub trait MoveType<T: Serialize = Self>: Serialize {
  /// Returns the Move type for this type.
  fn move_type(package: ObjectID) -> TypeTag;

  fn get_typed_value(&self, _package: ObjectID) -> TypedValue<Self>
  where
    Self: MoveType,
    Self: Sized,
  {
    TypedValue::Other(self)
  }
}

impl MoveType for u8 {
  fn move_type(_package: ObjectID) -> TypeTag {
    TypeTag::U8
  }
}

impl MoveType for u16 {
  fn move_type(_package: ObjectID) -> TypeTag {
    TypeTag::U16
  }
}

impl MoveType for u32 {
  fn move_type(_package: ObjectID) -> TypeTag {
    TypeTag::U32
  }
}

impl MoveType for u64 {
  fn move_type(_package: ObjectID) -> TypeTag {
    TypeTag::U64
  }
}

impl MoveType for u128 {
  fn move_type(_package: ObjectID) -> TypeTag {
    TypeTag::U128
  }
}

impl MoveType for bool {
  fn move_type(_package: ObjectID) -> TypeTag {
    TypeTag::Bool
  }
}

impl MoveType for IotaAddress {
  fn move_type(_package: ObjectID) -> TypeTag {
    TypeTag::Address
  }
}

impl<T: MoveType> MoveType for Vec<T> {
  fn move_type(package: ObjectID) -> TypeTag {
    TypeTag::Vector(Box::new(T::move_type(package)))
  }
}