shindan_maker/
segment.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::fmt;
4use std::ops::Deref;
5
6/// A segment of a shindan result.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct Segment {
9    #[serde(rename = "type")]
10    pub type_: String,
11    pub data: Value,
12}
13
14impl Segment {
15    /**
16    Create a new segment.
17
18    # Arguments
19    - `type_` - The type of the segment.
20    - `data` - The data of the segment.
21
22    # Returns
23    A new segment.
24
25    # Examples
26    ```
27    use serde_json::json;
28    use shindan_maker::Segment;
29
30    let segment = Segment::new("text", json!({"text": "Hello, world!"}));
31    ```
32    */
33    pub fn new(type_: &str, data: Value) -> Self {
34        Segment {
35            type_: type_.to_string(),
36            data,
37        }
38    }
39
40    /**
41    Get the string representation of the segment.
42
43    # Returns
44    - `Some(String)`: The string representation of the segment.
45    - `None`: If the segment type is not text or image.
46
47    # Examples
48    ```
49    use serde_json::json;
50    use shindan_maker::Segment;
51
52    let segment = Segment::new("text", json!({"text": "Hello, world!"}));
53    assert_eq!(segment.get_str(), Some("Hello, world!".to_string()));
54    ```
55    */
56    pub fn get_str(&self) -> Option<String> {
57        match self.type_.as_str() {
58            "text" => self
59                .data
60                .as_object()
61                .and_then(|map| map.get("text"))
62                .and_then(Value::as_str)
63                .map(String::from),
64            "image" => self
65                .data
66                .as_object()
67                .and_then(|map| map.get("file"))
68                .and_then(Value::as_str)
69                .map(String::from),
70            _ => None,
71        }
72    }
73}
74
75impl PartialEq for Segment {
76    fn eq(&self, other: &Self) -> bool {
77        self.type_ == other.type_ && self.data == other.data
78    }
79}
80
81impl Eq for Segment {}
82
83/// A collection of segments.
84#[derive(Debug, Clone)]
85pub struct Segments(pub Vec<Segment>);
86
87impl Deref for Segments {
88    type Target = Vec<Segment>;
89
90    fn deref(&self) -> &Self::Target {
91        &self.0
92    }
93}
94
95impl fmt::Display for Segments {
96    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
97        let str = self
98            .iter()
99            .map(|segment| segment.get_str().unwrap())
100            .collect::<Vec<String>>()
101            .join("");
102        write!(f, "{}", str)
103    }
104}