pub struct WithUnit;Expand description
Default deserializer for Durations, ByteSizes and EtherAmounts.
Values can be deserialized from 2 formats:
- String consisting of a number, optional whitespace and a unit, such as “30 secs” or “500ms” (for
Duration) / “4 MiB” (forByteSize). The unit must correspond to aTimeUnit/SizeUnit/EtherUnit.Durations andEtherAmounts support decimal numbers, such as3.5 secor1.5e-5 ether;ByteSizes only support integers. - Object with a single key and a numeric value, such as
{ "hours": 3 }(forDuration) /{ "kb": 512 }(forSizeUnit). To prevent precision loss, decimal values may be enclosed in a string (e.g.,{ "ether": "0.000123456" }).
Thanks to nesting of object params, the second approach automatically means that a duration can be parsed
from a param name suffixed with a unit. For example, a value latency_ms: 500 for parameter latency
will be recognized as 500 ms.
§Examples
#[derive(DescribeConfig, DeserializeConfig)]
struct TestConfig {
latency: Duration,
disk: ByteSize,
#[config(default)]
fee: EtherAmount,
}
// Parsing from a string
let source = smart_config::config!(
"latency": "30 secs",
"disk": "256 MiB",
"fee": "100 gwei",
);
let config: TestConfig = testing::test(source)?;
assert_eq!(config.latency, Duration::from_secs(30));
assert_eq!(config.disk, ByteSize(256 << 20));
assert_eq!(config.fee, EtherAmount(100_000_000_000));
// Parsing from an object
let source = smart_config::config!(
"latency": serde_json::json!({ "hours": 3.5 }),
"disk": serde_json::json!({ "gigabytes": 2 }),
"fee": serde_json::json!({ "ether": "0.000125" }),
);
let config: TestConfig = testing::test(source)?;
assert_eq!(config.latency, Duration::from_secs(3_600 * 7 / 2));
assert_eq!(config.disk, ByteSize(2 << 30));
assert_eq!(config.fee, EtherAmount(125_000_000_000_000));
// Parsing from a suffixed parameter name
let source = Environment::from_iter("", [
("LATENCY_SEC", "1.5"),
("DISK_GB", "10"),
("FEE_IN_ETHER", "1.5e-5"),
]);
let config: TestConfig = testing::test(source)?;
assert_eq!(config.latency, Duration::from_millis(1_500));
assert_eq!(config.disk, ByteSize(10 << 30));
assert_eq!(config.fee, EtherAmount(15_000_000_000_000));Trait Implementations§
Source§impl DeserializeParam<ByteSize> for WithUnit
impl DeserializeParam<ByteSize> for WithUnit
Source§const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
Describes which parameter this deserializer is expecting.
Source§fn describe(&self, description: &mut TypeDescription)
fn describe(&self, description: &mut TypeDescription)
Additional info about the deserialized type, e.g., extended description.
Source§fn deserialize_param(
&self,
ctx: DeserializeContext<'_>,
param: &'static ParamMetadata,
) -> Result<ByteSize, ErrorWithOrigin>
fn deserialize_param( &self, ctx: DeserializeContext<'_>, param: &'static ParamMetadata, ) -> Result<ByteSize, ErrorWithOrigin>
Performs deserialization given the context and param metadata. Read more
Source§impl DeserializeParam<Duration> for WithUnit
impl DeserializeParam<Duration> for WithUnit
Source§const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
Describes which parameter this deserializer is expecting.
Source§fn describe(&self, description: &mut TypeDescription)
fn describe(&self, description: &mut TypeDescription)
Additional info about the deserialized type, e.g., extended description.
Source§fn deserialize_param(
&self,
ctx: DeserializeContext<'_>,
param: &'static ParamMetadata,
) -> Result<Duration, ErrorWithOrigin>
fn deserialize_param( &self, ctx: DeserializeContext<'_>, param: &'static ParamMetadata, ) -> Result<Duration, ErrorWithOrigin>
Performs deserialization given the context and param metadata. Read more
Source§impl DeserializeParam<EtherAmount> for WithUnit
impl DeserializeParam<EtherAmount> for WithUnit
Source§const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
Describes which parameter this deserializer is expecting.
Source§fn describe(&self, description: &mut TypeDescription)
fn describe(&self, description: &mut TypeDescription)
Additional info about the deserialized type, e.g., extended description.
Source§fn deserialize_param(
&self,
ctx: DeserializeContext<'_>,
param: &'static ParamMetadata,
) -> Result<EtherAmount, ErrorWithOrigin>
fn deserialize_param( &self, ctx: DeserializeContext<'_>, param: &'static ParamMetadata, ) -> Result<EtherAmount, ErrorWithOrigin>
Performs deserialization given the context and param metadata. Read more
Source§fn serialize_param(&self, param: &EtherAmount) -> Value
fn serialize_param(&self, param: &EtherAmount) -> Value
Serializes the provided parameter to the JSON model. Read more
Source§impl DeserializeParam<Option<ByteSize>> for WithUnit
impl DeserializeParam<Option<ByteSize>> for WithUnit
Source§const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
Describes which parameter this deserializer is expecting.
Source§fn describe(&self, description: &mut TypeDescription)
fn describe(&self, description: &mut TypeDescription)
Additional info about the deserialized type, e.g., extended description.
Source§fn deserialize_param(
&self,
ctx: DeserializeContext<'_>,
param: &'static ParamMetadata,
) -> Result<Option<ByteSize>, ErrorWithOrigin>
fn deserialize_param( &self, ctx: DeserializeContext<'_>, param: &'static ParamMetadata, ) -> Result<Option<ByteSize>, ErrorWithOrigin>
Performs deserialization given the context and param metadata. Read more
Source§impl DeserializeParam<Option<Duration>> for WithUnit
impl DeserializeParam<Option<Duration>> for WithUnit
Source§const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
Describes which parameter this deserializer is expecting.
Source§fn describe(&self, description: &mut TypeDescription)
fn describe(&self, description: &mut TypeDescription)
Additional info about the deserialized type, e.g., extended description.
Source§fn deserialize_param(
&self,
ctx: DeserializeContext<'_>,
param: &'static ParamMetadata,
) -> Result<Option<Duration>, ErrorWithOrigin>
fn deserialize_param( &self, ctx: DeserializeContext<'_>, param: &'static ParamMetadata, ) -> Result<Option<Duration>, ErrorWithOrigin>
Performs deserialization given the context and param metadata. Read more
Source§impl DeserializeParam<Option<EtherAmount>> for WithUnit
impl DeserializeParam<Option<EtherAmount>> for WithUnit
Source§const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
const EXPECTING: BasicTypes = Self::EXPECTED_TYPES
Describes which parameter this deserializer is expecting.
Source§fn describe(&self, description: &mut TypeDescription)
fn describe(&self, description: &mut TypeDescription)
Additional info about the deserialized type, e.g., extended description.
Source§fn deserialize_param(
&self,
ctx: DeserializeContext<'_>,
param: &'static ParamMetadata,
) -> Result<Option<EtherAmount>, ErrorWithOrigin>
fn deserialize_param( &self, ctx: DeserializeContext<'_>, param: &'static ParamMetadata, ) -> Result<Option<EtherAmount>, ErrorWithOrigin>
Performs deserialization given the context and param metadata. Read more
Source§fn serialize_param(&self, param: &Option<EtherAmount>) -> Value
fn serialize_param(&self, param: &Option<EtherAmount>) -> Value
Serializes the provided parameter to the JSON model. Read more
impl Copy for WithUnit
Auto Trait Implementations§
impl Freeze for WithUnit
impl RefUnwindSafe for WithUnit
impl Send for WithUnit
impl Sync for WithUnit
impl Unpin for WithUnit
impl UnwindSafe for WithUnit
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more