vertigo 0.11.2

Reactive Real-DOM library with SSR for Rust
Documentation
use std::borrow::{Borrow, Cow};
use std::fmt::Display;

use crate::{JsJson, JsJsonContext, JsJsonDeserialize, JsJsonSerialize};

#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct StaticString(pub Cow<'static, str>);

impl StaticString {
    pub fn as_str(&self) -> &str {
        self.0.borrow()
    }

    pub fn is_empty(&self) -> bool {
        match &self.0 {
            Cow::Borrowed(str) => str.is_empty(),
            Cow::Owned(str) => str.is_empty(),
        }
    }
}

impl From<&'static str> for StaticString {
    fn from(value: &'static str) -> Self {
        Self(Cow::Borrowed(value))
    }
}

impl From<String> for StaticString {
    fn from(value: String) -> Self {
        Self(Cow::Owned(value))
    }
}

impl Default for StaticString {
    fn default() -> Self {
        Self(Cow::Borrowed(""))
    }
}

impl Display for StaticString {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match &self.0 {
            Cow::Borrowed(data) => f.write_str(data),
            Cow::Owned(data) => f.write_str(data),
        }
    }
}

impl JsJsonDeserialize for StaticString {
    fn from_json(
        _context: crate::JsJsonContext,
        json: crate::JsJson,
    ) -> Result<Self, crate::JsJsonContext> {
        if let JsJson::String(value) = json {
            return Ok(value.into());
        }

        Err(JsJsonContext::new(format!(
            "Expected String, received={}",
            json.typename()
        )))
    }
}

impl JsJsonSerialize for StaticString {
    fn to_json(self) -> crate::JsJson {
        JsJson::String(self.as_str().to_string())
    }
}