use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
#[serde(untagged)]
pub enum StringOrStringArray {
StringValue(String),
ArrayValue(Vec<String>),
}
impl std::fmt::Display for StringOrStringArray {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
StringOrStringArray::StringValue(s) => write!(f, "{}", s),
StringOrStringArray::ArrayValue(v) => write!(f, "{}", v.join(",")),
}
}
}
impl StringOrStringArray {
pub fn as_vec(&self) -> Vec<String> {
match self {
StringOrStringArray::StringValue(s) => vec![s.clone()],
StringOrStringArray::ArrayValue(v) => v.clone(),
}
}
}
impl Default for StringOrStringArray {
fn default() -> Self {
StringOrStringArray::ArrayValue(Vec::new())
}
}
impl From<String> for StringOrStringArray {
fn from(s: String) -> Self {
StringOrStringArray::StringValue(s)
}
}
impl From<&str> for StringOrStringArray {
fn from(s: &str) -> Self {
StringOrStringArray::StringValue(s.to_string())
}
}
impl From<Vec<String>> for StringOrStringArray {
fn from(v: Vec<String>) -> Self {
StringOrStringArray::ArrayValue(v)
}
}
impl From<Vec<&str>> for StringOrStringArray {
fn from(v: Vec<&str>) -> Self {
StringOrStringArray::ArrayValue(v.into_iter().map(|s| s.to_string()).collect())
}
}