dfx_core/json/
structure.rs

1use candid::Deserialize;
2use schemars::JsonSchema;
3use semver::{Version, VersionReq};
4use serde::Serialize;
5use std::fmt::Display;
6use std::ops::{Deref, DerefMut};
7use std::str::FromStr;
8use url::Url;
9
10#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema, PartialEq, Eq)]
11#[serde(untagged)]
12pub enum SerdeVec<T> {
13    One(T),
14    Many(Vec<T>),
15}
16
17impl<T> SerdeVec<T> {
18    pub fn into_vec(self) -> Vec<T> {
19        match self {
20            Self::One(t) => vec![t],
21            Self::Many(ts) => ts,
22        }
23    }
24}
25
26impl<T> Default for SerdeVec<T> {
27    fn default() -> Self {
28        Self::Many(vec![])
29    }
30}
31
32#[derive(Serialize, serde::Deserialize)]
33#[serde(untagged)]
34enum PossiblyStrInner<T> {
35    NotStr(T),
36    Str(String),
37}
38
39#[derive(Serialize, Deserialize, Default, Copy, Clone, Debug, JsonSchema)]
40#[serde(try_from = "PossiblyStrInner<T>")]
41pub struct PossiblyStr<T>(pub T)
42where
43    T: FromStr,
44    T::Err: Display;
45
46impl<T> TryFrom<PossiblyStrInner<T>> for PossiblyStr<T>
47where
48    T: FromStr,
49    T::Err: Display,
50{
51    type Error = T::Err;
52    fn try_from(inner: PossiblyStrInner<T>) -> Result<Self, Self::Error> {
53        match inner {
54            PossiblyStrInner::NotStr(t) => Ok(Self(t)),
55            PossiblyStrInner::Str(str) => T::from_str(&str).map(Self),
56        }
57    }
58}
59
60#[derive(Debug, Serialize, Deserialize, JsonSchema)]
61#[serde(transparent)]
62pub struct VersionReqWithJsonSchema(#[schemars(with = "String")] pub VersionReq);
63
64impl Deref for VersionReqWithJsonSchema {
65    type Target = VersionReq;
66
67    fn deref(&self) -> &Self::Target {
68        &self.0
69    }
70}
71
72impl DerefMut for VersionReqWithJsonSchema {
73    fn deref_mut(&mut self) -> &mut Self::Target {
74        &mut self.0
75    }
76}
77
78#[derive(Debug, Serialize, Deserialize, JsonSchema)]
79#[serde(transparent)]
80pub struct VersionWithJsonSchema(#[schemars(with = "String")] pub Version);
81
82impl Deref for VersionWithJsonSchema {
83    type Target = Version;
84
85    fn deref(&self) -> &Self::Target {
86        &self.0
87    }
88}
89
90impl DerefMut for VersionWithJsonSchema {
91    fn deref_mut(&mut self) -> &mut Self::Target {
92        &mut self.0
93    }
94}
95
96#[derive(Debug, Serialize, Deserialize, JsonSchema)]
97#[serde(transparent)]
98pub struct UrlWithJsonSchema(#[schemars(with = "String")] pub Url);
99
100impl Deref for UrlWithJsonSchema {
101    type Target = Url;
102
103    fn deref(&self) -> &Self::Target {
104        &self.0
105    }
106}
107
108impl DerefMut for UrlWithJsonSchema {
109    fn deref_mut(&mut self) -> &mut Self::Target {
110        &mut self.0
111    }
112}