cellang/types/
mod.rs

1mod de;
2pub mod duration;
3pub mod dynamic;
4pub mod list;
5pub mod map;
6mod ser;
7pub mod value;
8
9use std::sync::Arc;
10
11pub use self::duration::*;
12pub use self::list::*;
13pub use self::map::*;
14pub use self::value::*;
15
16use miette::Error;
17
18use crate::parser::TokenTree;
19use crate::Environment;
20
21/// Function is a wrapper for a dynamic function that can be registered in the environment.
22pub type Function = Arc<
23    dyn Fn(&Environment, &[TokenTree]) -> Result<Value, Error> + Send + Sync,
24>;
25
26/// Function is a wrapper for turning Value into any type that implements DeserializeOwned.
27pub fn try_from_value<T>(value: Value) -> Result<T, Error>
28where
29    T: serde::de::DeserializeOwned,
30{
31    match T::deserialize(value) {
32        Ok(value) => Ok(value),
33        Err(err) => miette::bail!("Failed to deserialize value: {}", err),
34    }
35}
36
37/// Function is a wrapper for turning Map into any type that implements DeserializeOwned.
38pub fn try_from_map<T>(value: Map) -> Result<T, Error>
39where
40    T: serde::de::DeserializeOwned,
41{
42    match T::deserialize(value) {
43        Ok(value) => Ok(value),
44        Err(err) => miette::bail!("Failed to deserialize value: {}", err),
45    }
46}
47
48/// Function is a wrapper for turning List into any type that implements DeserializeOwned.
49pub fn try_from_list<T>(value: List) -> Result<T, Error>
50where
51    T: serde::de::DeserializeOwned,
52{
53    match T::deserialize(value) {
54        Ok(value) => Ok(value),
55        Err(err) => miette::bail!("Failed to deserialize value: {}", err),
56    }
57}