format.rs

 1use collections::HashMap;
 2use serde::Deserialize;
 3
 4#[derive(Deserialize)]
 5pub(crate) struct VSSnippetsFile {
 6    #[serde(flatten)]
 7    pub(crate) snippets: HashMap<String, VSCodeSnippet>,
 8}
 9
10#[derive(Deserialize)]
11#[serde(untagged)]
12pub(crate) enum ListOrDirect {
13    Single(String),
14    List(Vec<String>),
15}
16
17impl From<ListOrDirect> for Vec<String> {
18    fn from(list: ListOrDirect) -> Self {
19        match list {
20            ListOrDirect::Single(entry) => vec![entry],
21            ListOrDirect::List(entries) => entries,
22        }
23    }
24}
25
26impl std::fmt::Display for ListOrDirect {
27    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
28        write!(
29            f,
30            "{}",
31            match self {
32                Self::Single(v) => v.to_owned(),
33                Self::List(v) => v.join("\n"),
34            }
35        )
36    }
37}
38
39#[derive(Deserialize)]
40pub(crate) struct VSCodeSnippet {
41    pub(crate) prefix: Option<ListOrDirect>,
42    pub(crate) body: ListOrDirect,
43    pub(crate) description: Option<ListOrDirect>,
44}