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§

source

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§

source

fn expected() -> String

Description of values acceptable by unpack_value, e. g. list or str.

source

fn unpack_value_err(value: Value<'v>) -> Result<Self>

Unpack a value, but return error instead of None if unpacking fails.

source

fn unpack_param(value: Value<'v>) -> Result<Self>

Unpack value, but instead of None return error about incorrect argument type.

source

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

source§

fn unpack_value(value: Value<'_>) -> Option<Self>

source§

impl UnpackValue<'_> for i32

source§

fn unpack_value(value: Value<'_>) -> Option<Self>

source§

impl<'v> UnpackValue<'v> for &'v str

source§

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.

source§

fn unpack_value(value: Value<'v>) -> Option<Self>

source§

impl<'v> UnpackValue<'v> for i64

source§

impl<'v> UnpackValue<'v> for isize

source§

impl<'v> UnpackValue<'v> for u32

source§

impl<'v> UnpackValue<'v> for u64

source§

impl<'v> UnpackValue<'v> for usize

source§

impl<'v> UnpackValue<'v> for String

source§

impl<'v> UnpackValue<'v> for BigInt

source§

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)

source§

impl<'v, TLeft: UnpackValue<'v>, TRight: UnpackValue<'v>> UnpackValue<'v> for Either<TLeft, TRight>

Implementors§

source§

impl<'v> UnpackValue<'v> for &'v ListRef<'v>

source§

impl<'v> UnpackValue<'v> for &'v Range

source§

impl<'v> UnpackValue<'v> for &'v FrozenTupleRef

source§

impl<'v> UnpackValue<'v> for &'v TupleRef<'v>

source§

impl<'v> UnpackValue<'v> for &'v EnumValue<'v>

source§

impl<'v> UnpackValue<'v> for &'v Record<'v>

source§

impl<'v> UnpackValue<'v> for DictRef<'v>

source§

impl<'v> UnpackValue<'v> for StarlarkFloat

Allows only a float - an int will not be accepted.

source§

impl<'v> UnpackValue<'v> for NoneType

source§

impl<'v> UnpackValue<'v> for Value<'v>

source§

impl<'v> UnpackValue<'v> for StructRef<'v>

source§

impl<'v> UnpackValue<'v> for StarlarkCallable<'v>

source§

impl<'v, K: UnpackValue<'v> + Hash + Eq, V: UnpackValue<'v>> UnpackValue<'v> for SmallMap<K, V>

source§

impl<'v, K: UnpackValue<'v>, V: UnpackValue<'v>> UnpackValue<'v> for DictOf<'v, K, V>

source§

impl<'v, T> UnpackValue<'v> for ValueTypedComplex<'v, T>
where T: ComplexValue<'v>, T::Frozen: StarlarkValue<'static>,

source§

impl<'v, T: StarlarkValue<'v>> UnpackValue<'v> for ValueTyped<'v, T>

source§

impl<'v, T: UnpackValue<'v>> UnpackValue<'v> for NoneOr<T>

source§

impl<'v, T: UnpackValue<'v>> UnpackValue<'v> for UnpackList<T>

source§

impl<'v, T: UnpackValue<'v>> UnpackValue<'v> for UnpackListOrTuple<T>

source§

impl<'v, T: UnpackValue<'v>> UnpackValue<'v> for ValueOf<'v, T>

source§

impl<'v, T: UnpackValue<'v>> UnpackValue<'v> for UnpackTuple<T>

source§

impl<'v, T: StarlarkTypeRepr> UnpackValue<'v> for ValueOfUnchecked<'v, T>

source§

impl<'v, V: UnpackValue<'v>> UnpackValue<'v> for ListOf<'v, V>

source§

impl<'v, V: UnpackValue<'v>> UnpackValue<'v> for StructOf<'v, V>