libipld_core/
convert.rs

1//! Conversion to and from ipld.
2use crate::cid::Cid;
3use crate::ipld::Ipld;
4use alloc::{
5    borrow::ToOwned,
6    boxed::Box,
7    collections::BTreeMap,
8    string::{String, ToString},
9    vec::Vec,
10};
11
12macro_rules! derive_to_ipld_prim {
13    ($enum:ident, $ty:ty, $fn:ident) => {
14        impl From<$ty> for Ipld {
15            fn from(t: $ty) -> Self {
16                Ipld::$enum(t.$fn() as _)
17            }
18        }
19    };
20}
21
22macro_rules! derive_to_ipld {
23    ($enum:ident, $ty:ty, $($fn:ident),*) => {
24        impl From<$ty> for Ipld {
25            fn from(t: $ty) -> Self {
26                Ipld::$enum(t$(.$fn())*)
27            }
28        }
29    };
30}
31
32macro_rules! derive_to_ipld_generic {
33   ($enum:ident, $ty:ty, $($fn:ident),*) => {
34       impl From<$ty> for Ipld {
35           fn from(t: $ty) -> Self {
36               Ipld::$enum(t$(.$fn())*)
37           }
38       }
39   };
40}
41
42derive_to_ipld!(Bool, bool, clone);
43derive_to_ipld_prim!(Integer, i8, clone);
44derive_to_ipld_prim!(Integer, i16, clone);
45derive_to_ipld_prim!(Integer, i32, clone);
46derive_to_ipld_prim!(Integer, i64, clone);
47derive_to_ipld_prim!(Integer, i128, clone);
48derive_to_ipld_prim!(Integer, isize, clone);
49derive_to_ipld_prim!(Integer, u8, clone);
50derive_to_ipld_prim!(Integer, u16, clone);
51derive_to_ipld_prim!(Integer, u32, clone);
52derive_to_ipld_prim!(Integer, u64, clone);
53derive_to_ipld_prim!(Integer, usize, clone);
54derive_to_ipld_prim!(Float, f32, clone);
55derive_to_ipld_prim!(Float, f64, clone);
56derive_to_ipld!(String, String, into);
57derive_to_ipld!(String, &str, to_string);
58derive_to_ipld!(Bytes, Box<[u8]>, into_vec);
59derive_to_ipld!(Bytes, Vec<u8>, into);
60derive_to_ipld!(Bytes, &[u8], to_vec);
61derive_to_ipld!(List, Vec<Ipld>, into);
62derive_to_ipld!(Map, BTreeMap<String, Ipld>, to_owned);
63derive_to_ipld_generic!(Link, Cid, clone);
64derive_to_ipld_generic!(Link, &Cid, to_owned);