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}