shex_ast/ast/
string_or_literal_stem.rs1use 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}