Trait starlark::values::UnpackValue
source · pub trait UnpackValue<'v>: Sized + StarlarkTypeRepr {
// Required method
fn unpack_value(value: Value<'v>) -> Option<Self>;
// Provided methods
fn expected() -> String { ... }
fn unpack_value_err(value: Value<'v>) -> Result<Self> { ... }
fn unpack_param(value: Value<'v>) -> Result<Self> { ... }
fn unpack_named_param(value: Value<'v>, param_name: &str) -> Result<Self> { ... }
}
Expand description
How to convert a Value
to a Rust type. Required for all arguments in
a #[starlark_module]
definition.
Note for simple references it often can be implemented with #[starlark_value(UnpackValue)]
,
for example:
#[derive(
Debug,
derive_more::Display,
Allocative,
NoSerialize,
ProvidesStaticType
)]
struct MySimpleValue;
#[starlark_value(type = "MySimpleValue", UnpackValue, StarlarkTypeRepr)]
impl<'v> StarlarkValue<'v> for MySimpleValue {}
Whereas for types that aren’t also StarlarkValue
you can define:
struct BoolOrInt(i32);
impl StarlarkTypeRepr for BoolOrInt {
fn starlark_type_repr() -> Ty {
Either::<bool, i32>::starlark_type_repr()
}
}
impl<'v> UnpackValue<'v> for BoolOrInt {
fn unpack_value(value: Value<'v>) -> Option<Self> {
if let Some(x) = value.unpack_bool() {
Some(BoolOrInt(x as i32))
} else {
value.unpack_i32().map(BoolOrInt)
}
}
}
Required Methods§
sourcefn unpack_value(value: Value<'v>) -> Option<Self>
fn unpack_value(value: Value<'v>) -> Option<Self>
Given a Value
, try and unpack it into the given type, which may involve some element of conversion.
Provided Methods§
sourcefn unpack_value_err(value: Value<'v>) -> Result<Self>
fn unpack_value_err(value: Value<'v>) -> Result<Self>
Unpack a value, but return error instead of None
if unpacking fails.
sourcefn unpack_param(value: Value<'v>) -> Result<Self>
fn unpack_param(value: Value<'v>) -> Result<Self>
Unpack value, but instead of None
return error about incorrect argument type.
sourcefn unpack_named_param(value: Value<'v>, param_name: &str) -> Result<Self>
fn unpack_named_param(value: Value<'v>, param_name: &str) -> Result<Self>
Unpack value, but instead of None
return error about incorrect named argument type.
Object Safety§
This trait is not object safe.
Implementations on Foreign Types§
source§impl UnpackValue<'_> for bool
impl UnpackValue<'_> for bool
fn unpack_value(value: Value<'_>) -> Option<Self>
source§impl UnpackValue<'_> for i32
impl UnpackValue<'_> for i32
fn unpack_value(value: Value<'_>) -> Option<Self>
source§impl<'v> UnpackValue<'v> for &'v str
impl<'v> UnpackValue<'v> for &'v str
source§impl<'v> UnpackValue<'v> for f64
impl<'v> UnpackValue<'v> for f64
Allows either a float or an int. If the int is not in the range of a float, it will lose precision.
fn unpack_value(value: Value<'v>) -> Option<Self>
source§impl<'v> UnpackValue<'v> for i64
impl<'v> UnpackValue<'v> for i64
source§impl<'v> UnpackValue<'v> for isize
impl<'v> UnpackValue<'v> for isize
source§impl<'v> UnpackValue<'v> for u32
impl<'v> UnpackValue<'v> for u32
source§impl<'v> UnpackValue<'v> for u64
impl<'v> UnpackValue<'v> for u64
source§impl<'v> UnpackValue<'v> for usize
impl<'v> UnpackValue<'v> for usize
source§impl<'v> UnpackValue<'v> for String
impl<'v> UnpackValue<'v> for String
source§impl<'v> UnpackValue<'v> for BigInt
impl<'v> UnpackValue<'v> for BigInt
source§impl<'v, K: UnpackValue<'v> + Ord, V: UnpackValue<'v>> UnpackValue<'v> for BTreeMap<K, V>
impl<'v, K: UnpackValue<'v> + Ord, V: UnpackValue<'v>> UnpackValue<'v> for BTreeMap<K, V>
source§impl<'v, T1: UnpackValue<'v>, T2: UnpackValue<'v>> UnpackValue<'v> for (T1, T2)
impl<'v, T1: UnpackValue<'v>, T2: UnpackValue<'v>> UnpackValue<'v> for (T1, T2)
source§impl<'v, TLeft: UnpackValue<'v>, TRight: UnpackValue<'v>> UnpackValue<'v> for Either<TLeft, TRight>
impl<'v, TLeft: UnpackValue<'v>, TRight: UnpackValue<'v>> UnpackValue<'v> for Either<TLeft, TRight>
Implementors§
impl<'v> UnpackValue<'v> for &'v ListRef<'v>
impl<'v> UnpackValue<'v> for &'v Range
impl<'v> UnpackValue<'v> for &'v FrozenTupleRef
impl<'v> UnpackValue<'v> for &'v TupleRef<'v>
impl<'v> UnpackValue<'v> for &'v EnumValue<'v>
impl<'v> UnpackValue<'v> for &'v Record<'v>
impl<'v> UnpackValue<'v> for DictRef<'v>
impl<'v> UnpackValue<'v> for StarlarkFloat
Allows only a float - an int will not be accepted.