use std::borrow::Cow;
use crate::error::JsonToolsError;
#[derive(Debug, Clone)]
#[repr(u8)] pub enum JsonInput<'a> {
Single(Cow<'a, str>),
Multiple(&'a [&'a str]),
MultipleOwned(Vec<Cow<'a, str>>),
}
impl<'a> From<&'a str> for JsonInput<'a> {
fn from(json: &'a str) -> Self {
JsonInput::Single(Cow::Borrowed(json))
}
}
impl<'a> From<&'a String> for JsonInput<'a> {
fn from(json: &'a String) -> Self {
JsonInput::Single(Cow::Borrowed(json.as_str()))
}
}
impl<'a> From<&'a [&'a str]> for JsonInput<'a> {
fn from(json_list: &'a [&'a str]) -> Self {
JsonInput::Multiple(json_list)
}
}
impl<'a> From<Vec<&'a str>> for JsonInput<'a> {
fn from(json_list: Vec<&'a str>) -> Self {
JsonInput::MultipleOwned(json_list.into_iter().map(Cow::Borrowed).collect())
}
}
impl<'a> From<Vec<String>> for JsonInput<'a> {
fn from(json_list: Vec<String>) -> Self {
JsonInput::MultipleOwned(json_list.into_iter().map(Cow::Owned).collect())
}
}
impl<'a> From<&'a [String]> for JsonInput<'a> {
fn from(json_list: &'a [String]) -> Self {
JsonInput::MultipleOwned(
json_list
.iter()
.map(|s| Cow::Borrowed(s.as_str()))
.collect(),
)
}
}
#[derive(Debug, Clone)]
#[repr(u8)] pub enum JsonOutput {
Single(String),
Multiple(Vec<String>),
}
impl JsonOutput {
#[must_use]
#[deprecated(
since = "0.10.0",
note = "Use try_into_single() instead to avoid panics"
)]
pub fn into_single(self) -> String {
match self {
JsonOutput::Single(result) => result,
JsonOutput::Multiple(_) => panic!("Expected single result but got multiple"),
}
}
#[must_use]
#[deprecated(
since = "0.10.0",
note = "Use try_into_multiple() instead to avoid panics"
)]
pub fn into_multiple(self) -> Vec<String> {
match self {
JsonOutput::Single(_) => panic!("Expected multiple results but got single"),
JsonOutput::Multiple(results) => results,
}
}
pub fn try_into_single(self) -> Result<String, JsonToolsError> {
match self {
JsonOutput::Single(result) => Ok(result),
JsonOutput::Multiple(_) => Err(JsonToolsError::input_validation_error(
"Expected single result but got multiple",
)),
}
}
pub fn try_into_multiple(self) -> Result<Vec<String>, JsonToolsError> {
match self {
JsonOutput::Single(_) => Err(JsonToolsError::input_validation_error(
"Expected multiple results but got single",
)),
JsonOutput::Multiple(results) => Ok(results),
}
}
#[must_use]
pub fn into_vec(self) -> Vec<String> {
match self {
JsonOutput::Single(result) => vec![result],
JsonOutput::Multiple(results) => results,
}
}
}