dfx_core/json/
structure.rs1use 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}