wit_encoder/
resource.rs

1use crate::{ident::Ident, Docs, Params, Type};
2
3#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
6pub struct Resource {
7    pub(crate) funcs: Vec<ResourceFunc>,
8}
9
10impl Resource {
11    pub fn empty() -> Self {
12        Self { funcs: vec![] }
13    }
14
15    pub fn func(&mut self, func: ResourceFunc) {
16        self.funcs.push(func);
17    }
18
19    pub fn funcs(&self) -> &[ResourceFunc] {
20        &self.funcs
21    }
22
23    pub fn funcs_mut(&mut self) -> &mut Vec<ResourceFunc> {
24        &mut self.funcs
25    }
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
30#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
31pub struct ResourceFunc {
32    pub(crate) kind: ResourceFuncKind,
33    pub(crate) params: Params,
34    pub(crate) docs: Option<Docs>,
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
40pub enum ResourceFuncKind {
41    Method(Ident, Option<Type>),
42    Static(Ident, Option<Type>),
43    Constructor,
44}
45
46impl ResourceFunc {
47    pub fn method(name: impl Into<Ident>) -> Self {
48        Self {
49            kind: ResourceFuncKind::Method(name.into(), None),
50            params: Params::empty(),
51            docs: None,
52        }
53    }
54
55    pub fn static_(name: impl Into<Ident>) -> Self {
56        Self {
57            kind: ResourceFuncKind::Static(name.into(), None),
58            params: Params::empty(),
59            docs: None,
60        }
61    }
62
63    pub fn constructor() -> Self {
64        Self {
65            kind: ResourceFuncKind::Constructor,
66            params: Params::empty(),
67            docs: None,
68        }
69    }
70
71    pub fn set_name(&mut self, name: impl Into<Ident>) {
72        match &self.kind {
73            ResourceFuncKind::Method(_, results) => {
74                self.kind = ResourceFuncKind::Method(name.into(), results.clone())
75            }
76            ResourceFuncKind::Static(_, results) => {
77                self.kind = ResourceFuncKind::Static(name.into(), results.clone())
78            }
79            ResourceFuncKind::Constructor => panic!("constructors cannot have a name"),
80        }
81    }
82
83    pub fn kind(&self) -> &ResourceFuncKind {
84        &self.kind
85    }
86
87    pub fn set_params(&mut self, params: impl Into<Params>) {
88        self.params = params.into();
89    }
90
91    pub fn params(&self) -> &Params {
92        &self.params
93    }
94
95    pub fn params_mut(&mut self) -> &mut Params {
96        &mut self.params
97    }
98
99    pub fn set_result(&mut self, results: Option<Type>) {
100        match &self.kind {
101            ResourceFuncKind::Method(name, _) => {
102                self.kind = ResourceFuncKind::Method(name.clone(), results)
103            }
104            ResourceFuncKind::Static(name, _) => {
105                self.kind = ResourceFuncKind::Static(name.clone(), results)
106            }
107            ResourceFuncKind::Constructor => panic!("constructors cannot have results"),
108        }
109    }
110
111    pub fn result(&self) -> Option<&Option<Type>> {
112        match &self.kind {
113            ResourceFuncKind::Method(_, result) => Some(result),
114            ResourceFuncKind::Static(_, result) => Some(result),
115            ResourceFuncKind::Constructor => None,
116        }
117    }
118
119    pub fn result_mut(&mut self) -> Option<&mut Option<Type>> {
120        match &mut self.kind {
121            ResourceFuncKind::Method(_, result) => Some(result),
122            ResourceFuncKind::Static(_, result) => Some(result),
123            ResourceFuncKind::Constructor => None,
124        }
125    }
126
127    pub fn set_docs(&mut self, docs: Option<impl Into<Docs>>) {
128        self.docs = docs.map(|d| d.into());
129    }
130
131    pub fn docs(&self) -> &Option<Docs> {
132        &self.docs
133    }
134}