bnr_xfs/currency/
exponent.rs

1use std::fmt;
2
3use crate::xfs::{value::XfsValue, xfs_struct::XfsMember};
4use crate::{Error, Result};
5
6/// Represents the exponent field of a [Currency].
7#[repr(C)]
8#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
9pub struct Exponent(i32);
10
11impl Exponent {
12    /// Creates a new [Exponent].
13    pub const fn new() -> Self {
14        Self(0)
15    }
16
17    /// Creates a new [Exponent] from the provided parameter.
18    pub const fn create(val: i32) -> Self {
19        Self(val)
20    }
21
22    /// Gets the [XfsMember] name.
23    pub const fn xfs_name() -> &'static str {
24        "exponent"
25    }
26
27    /// Gets the inner representation of the [Exponent].
28    pub const fn inner(&self) -> i32 {
29        self.0
30    }
31
32    /// Sets the inner representation of the [Exponent].
33    pub fn set_inner(&mut self, val: i32) {
34        self.0 = val;
35    }
36
37    /// Converts into the inner representation of the [Exponent].
38    pub fn into_inner(self) -> i32 {
39        self.0
40    }
41}
42
43impl From<&Exponent> for i32 {
44    fn from(val: &Exponent) -> Self {
45        val.inner()
46    }
47}
48
49impl From<Exponent> for i32 {
50    fn from(val: Exponent) -> Self {
51        val.into_inner()
52    }
53}
54
55impl From<&Exponent> for u32 {
56    fn from(val: &Exponent) -> Self {
57        val.inner() as u32
58    }
59}
60
61impl From<Exponent> for u32 {
62    fn from(val: Exponent) -> Self {
63        val.into_inner() as u32
64    }
65}
66
67impl From<u32> for Exponent {
68    fn from(val: u32) -> Self {
69        (val as i32).into()
70    }
71}
72
73impl From<&u32> for Exponent {
74    fn from(val: &u32) -> Self {
75        (*val).into()
76    }
77}
78
79impl From<i32> for Exponent {
80    fn from(val: i32) -> Self {
81        Self::create(val)
82    }
83}
84
85impl From<&i32> for Exponent {
86    fn from(val: &i32) -> Self {
87        (*val).into()
88    }
89}
90
91impl From<&Exponent> for XfsValue {
92    fn from(val: &Exponent) -> Self {
93        Self::new().with_i4(val.inner())
94    }
95}
96
97impl From<Exponent> for XfsValue {
98    fn from(val: Exponent) -> Self {
99        (&val).into()
100    }
101}
102
103impl TryFrom<&XfsValue> for Exponent {
104    type Error = Error;
105
106    fn try_from(val: &XfsValue) -> Result<Self> {
107        Ok(val
108            .i4()
109            .ok_or(Error::Xfs(format!(
110                "Expected Exponent XfsValue, have: {val}"
111            )))?
112            .into())
113    }
114}
115
116impl From<&Exponent> for XfsMember {
117    fn from(val: &Exponent) -> Self {
118        Self::create(Exponent::xfs_name(), val.into())
119    }
120}
121
122impl From<Exponent> for XfsMember {
123    fn from(val: Exponent) -> Self {
124        (&val).into()
125    }
126}
127
128impl TryFrom<&XfsMember> for Exponent {
129    type Error = Error;
130
131    fn try_from(val: &XfsMember) -> Result<Self> {
132        match (val.name(), val.value().i4()) {
133            (n, Some(v)) if n == Exponent::xfs_name() => Ok(v.into()),
134            _ => Err(Error::Xfs(format!(
135                "Expected Exponent XfsMember, have: {val}"
136            ))),
137        }
138    }
139}
140
141impl TryFrom<XfsMember> for Exponent {
142    type Error = Error;
143
144    fn try_from(val: XfsMember) -> Result<Self> {
145        (&val).try_into()
146    }
147}
148
149impl fmt::Display for Exponent {
150    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
151        write!(f, "{}", self.inner())
152    }
153}