wit_encoder/
resource.rs

1use crate::{Docs, Params, Type, ident::Ident};
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, bool, Option<Type>),
42    Static(Ident, bool, Option<Type>),
43    Constructor,
44}
45
46impl ResourceFunc {
47    pub fn method(name: impl Into<Ident>, async_: bool) -> Self {
48        Self {
49            kind: ResourceFuncKind::Method(name.into(), async_, None),
50            params: Params::empty(),
51            docs: None,
52        }
53    }
54
55    pub fn static_(name: impl Into<Ident>, async_: bool) -> Self {
56        Self {
57            kind: ResourceFuncKind::Static(name.into(), async_, 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 &mut self.kind {
73            ResourceFuncKind::Method(n, ..) => {
74                *n = name.into();
75            }
76            ResourceFuncKind::Static(n, ..) => {
77                *n = name.into();
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, result: Option<Type>) {
100        *self.result_mut().expect("constructors cannot have results") = result;
101    }
102
103    pub fn result(&self) -> Option<&Option<Type>> {
104        match &self.kind {
105            ResourceFuncKind::Method(.., result) => Some(result),
106            ResourceFuncKind::Static(.., result) => Some(result),
107            ResourceFuncKind::Constructor => None,
108        }
109    }
110
111    pub fn result_mut(&mut self) -> Option<&mut Option<Type>> {
112        match &mut self.kind {
113            ResourceFuncKind::Method(.., result) => Some(result),
114            ResourceFuncKind::Static(.., result) => Some(result),
115            ResourceFuncKind::Constructor => None,
116        }
117    }
118
119    pub fn set_docs(&mut self, docs: Option<impl Into<Docs>>) {
120        self.docs = docs.map(|d| d.into());
121    }
122
123    pub fn docs(&self) -> &Option<Docs> {
124        &self.docs
125    }
126}