shex_ast/ast/
string_or_literal_stem.rs

1use std::{result, str::FromStr};
2
3use crate::ast::serde_string_or_struct::*;
4use serde::{Deserialize, Serialize, Serializer};
5use void::Void;
6
7#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)]
8#[serde(transparent)]
9pub struct StringOrLiteralStemWrapper {
10    #[serde(
11        serialize_with = "serialize_string_or_struct",
12        deserialize_with = "deserialize_string_or_struct"
13    )]
14    s: StringOrLiteralStem,
15}
16
17#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)]
18#[serde(untagged)]
19pub enum StringOrLiteralStem {
20    String(String),
21    LiteralStem { stem: String },
22}
23
24impl FromStr for StringOrLiteralStemWrapper {
25    type Err = Void;
26
27    fn from_str(s: &str) -> Result<Self, Self::Err> {
28        Ok(StringOrLiteralStemWrapper {
29            s: StringOrLiteralStem::String(s.to_string()),
30        })
31    }
32}
33
34impl FromStr for StringOrLiteralStem {
35    type Err = Void;
36
37    fn from_str(s: &str) -> Result<Self, Self::Err> {
38        Ok(StringOrLiteralStem::String(s.to_string()))
39    }
40}
41
42impl SerializeStringOrStruct for StringOrLiteralStem {
43    fn serialize_string_or_struct<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        match &self {
48            StringOrLiteralStem::String(ref r) => r.serialize(serializer),
49            _ => self.serialize(serializer),
50        }
51    }
52}