discord_webhook_rs/
field.rs

1use super::Error;
2
3use serde_json::Value;
4
5pub struct Field {
6    name: Option<String>,
7    value: Option<String>,
8    inline: Option<bool>,
9}
10
11impl Field {
12    pub fn new() -> Self {
13        Field {
14            name: None,
15            value: None,
16            inline: None,
17        }
18    }
19
20    pub fn name(mut self, name: impl Into<String>) -> Self {
21        self.name = Some(name.into());
22        self
23    }
24
25    pub fn value(mut self, value: impl Into<String>) -> Self {
26        self.value = Some(value.into());
27        self
28    }
29
30    pub fn inline(mut self, inline: bool) -> Self {
31        self.inline = Some(inline);
32        self
33    }
34
35    fn verify(&self) -> Result<(), Error> {
36        if let Some(name) = &self.name {
37            if name.len() > 256 {
38                return Err(Error::MaxContent);
39            }
40        } else {
41            return Err(Error::MissingNameField);
42        }
43
44        if let Some(value) = &self.value {
45            if value.len() > 1024 {
46                return Err(Error::MaxContent);
47            }
48        } else {
49            return Err(Error::MissingValueField);
50        }
51
52        Ok(())
53    }
54
55    pub fn build(&self) -> Result<Value, Error> {
56        self.verify()?;
57
58        let mut obj = serde_json::Map::new();
59
60        if let Some(name) = &self.name {
61            obj.insert("name".into(), Value::String(name.clone()));
62        };
63
64        if let Some(value) = &self.value {
65            obj.insert("value".into(), Value::String(value.clone()));
66        };
67
68        if let Some(inline) = &self.inline {
69            obj.insert("inline".into(), Value::Bool(inline.clone()));
70        };
71
72        Ok(Value::Object(obj))
73    }
74}