payjp_shared/
statement_url.rs

1/// 取引明細ダウンロードURLオブジェクト
2///
3/// For more details see <<https://pay.jp/docs/api>>.
4#[derive(Clone,Debug,)]#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
5pub struct StatementUrl {
6    /// 有効期限のタイムスタンプ。
7    /// 有効期限は発行から1時間です。
8pub expires: i64,
9    /// 取引明細書ダウンロードURL
10pub url: String,
11
12}
13#[doc(hidden)]
14pub struct StatementUrlBuilder {
15    expires: Option<i64>,
16url: Option<String>,
17
18}
19
20#[allow(unused_variables, irrefutable_let_patterns, clippy::let_unit_value, clippy::match_single_binding, clippy::single_match)]
21const _: () = {
22    use miniserde::de::{Map, Visitor};
23    use miniserde::json::Value;
24    use miniserde::{make_place, Deserialize, Result};
25    use payjp_types::{MapBuilder, ObjectDeser};
26    use payjp_types::miniserde_helpers::FromValueOpt;
27
28    make_place!(Place);
29
30    impl Deserialize for StatementUrl {
31    fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
32       Place::new(out)
33    }
34}
35
36struct Builder<'a> {
37    out: &'a mut Option<StatementUrl>,
38    builder: StatementUrlBuilder,
39}
40
41impl Visitor for Place<StatementUrl> {
42    fn map(&mut self) -> Result<Box<dyn Map + '_>> {
43        Ok(Box::new(Builder {
44            out: &mut self.out,
45            builder: StatementUrlBuilder::deser_default(),
46        }))
47    }
48}
49
50impl MapBuilder for StatementUrlBuilder {
51    type Out = StatementUrl;
52    fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
53        Ok(match k {
54            "expires" => Deserialize::begin(&mut self.expires),
55"url" => Deserialize::begin(&mut self.url),
56
57            _ => <dyn Visitor>::ignore(),
58        })
59    }
60
61    fn deser_default() -> Self {
62        Self {
63            expires: Deserialize::default(),
64url: Deserialize::default(),
65
66        }
67    }
68
69    fn take_out(&mut self) -> Option<Self::Out> {
70        let (Some(expires),
71Some(url),
72) = (self.expires,
73self.url.take(),
74) else {
75            return None;
76        };
77        Some(Self::Out { expires,url })
78    }
79}
80
81impl<'a> Map for Builder<'a> {
82    fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
83        self.builder.key(k)
84    }
85
86    fn finish(&mut self) -> Result<()> {
87        *self.out = self.builder.take_out();
88        Ok(())
89    }
90}
91
92impl ObjectDeser for StatementUrl {
93    type Builder = StatementUrlBuilder;
94}
95
96impl FromValueOpt for StatementUrl {
97    fn from_value(v: Value) -> Option<Self> {
98        let Value::Object(obj) = v else {
99            return None;
100        };
101        let mut b = StatementUrlBuilder::deser_default();
102        for (k, v) in obj {
103            match k.as_str() {
104                "expires" => b.expires = FromValueOpt::from_value(v),
105"url" => b.url = FromValueOpt::from_value(v),
106
107                _ => {}
108            }
109        }
110        b.take_out()
111    }
112}
113
114};
115#[cfg(feature = "serialize")]
116impl serde::Serialize for StatementUrl {
117    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
118        use serde::ser::SerializeStruct;
119        let mut s = s.serialize_struct("StatementUrl", 3)?;
120        s.serialize_field("expires", &self.expires)?;
121s.serialize_field("url", &self.url)?;
122
123        s.serialize_field("object", "statement_url")?;
124        s.end()
125    }
126}