payjp_core/
statement_item.rs

1/// Statementに含まれる項目
2///
3/// For more details see <<https://pay.jp/docs/api>>.
4#[derive(Clone,Debug,)]#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
5#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
6pub struct StatementItem {
7    /// 集計された金額
8    /// 正の値は加盟店への支払額、負の値は請求額を表します。
9pub amount: i64,
10    /// Subjectに対応する表示名
11pub name: String,
12    /// 集計項目
13pub subject: String,
14    /// 税率(パーセント表記)。小数点以下2桁までの数値の文字列型。
15pub tax_rate: String,
16
17}
18#[doc(hidden)]
19pub struct StatementItemBuilder {
20    amount: Option<i64>,
21name: Option<String>,
22subject: Option<String>,
23tax_rate: Option<String>,
24
25}
26
27#[allow(unused_variables, irrefutable_let_patterns, clippy::let_unit_value, clippy::match_single_binding, clippy::single_match)]
28const _: () = {
29    use miniserde::de::{Map, Visitor};
30    use miniserde::json::Value;
31    use miniserde::{make_place, Deserialize, Result};
32    use payjp_types::{MapBuilder, ObjectDeser};
33    use payjp_types::miniserde_helpers::FromValueOpt;
34
35    make_place!(Place);
36
37    impl Deserialize for StatementItem {
38    fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
39       Place::new(out)
40    }
41}
42
43struct Builder<'a> {
44    out: &'a mut Option<StatementItem>,
45    builder: StatementItemBuilder,
46}
47
48impl Visitor for Place<StatementItem> {
49    fn map(&mut self) -> Result<Box<dyn Map + '_>> {
50        Ok(Box::new(Builder {
51            out: &mut self.out,
52            builder: StatementItemBuilder::deser_default(),
53        }))
54    }
55}
56
57impl MapBuilder for StatementItemBuilder {
58    type Out = StatementItem;
59    fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
60        Ok(match k {
61            "amount" => Deserialize::begin(&mut self.amount),
62"name" => Deserialize::begin(&mut self.name),
63"subject" => Deserialize::begin(&mut self.subject),
64"tax_rate" => Deserialize::begin(&mut self.tax_rate),
65
66            _ => <dyn Visitor>::ignore(),
67        })
68    }
69
70    fn deser_default() -> Self {
71        Self {
72            amount: Deserialize::default(),
73name: Deserialize::default(),
74subject: Deserialize::default(),
75tax_rate: Deserialize::default(),
76
77        }
78    }
79
80    fn take_out(&mut self) -> Option<Self::Out> {
81        let (Some(amount),
82Some(name),
83Some(subject),
84Some(tax_rate),
85) = (self.amount,
86self.name.take(),
87self.subject.take(),
88self.tax_rate.take(),
89) else {
90            return None;
91        };
92        Some(Self::Out { amount,name,subject,tax_rate })
93    }
94}
95
96impl<'a> Map for Builder<'a> {
97    fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
98        self.builder.key(k)
99    }
100
101    fn finish(&mut self) -> Result<()> {
102        *self.out = self.builder.take_out();
103        Ok(())
104    }
105}
106
107impl ObjectDeser for StatementItem {
108    type Builder = StatementItemBuilder;
109}
110
111impl FromValueOpt for StatementItem {
112    fn from_value(v: Value) -> Option<Self> {
113        let Value::Object(obj) = v else {
114            return None;
115        };
116        let mut b = StatementItemBuilder::deser_default();
117        for (k, v) in obj {
118            match k.as_str() {
119                "amount" => b.amount = FromValueOpt::from_value(v),
120"name" => b.name = FromValueOpt::from_value(v),
121"subject" => b.subject = FromValueOpt::from_value(v),
122"tax_rate" => b.tax_rate = FromValueOpt::from_value(v),
123
124                _ => {}
125            }
126        }
127        b.take_out()
128    }
129}
130
131};