use std::marker::PhantomData;
#[cfg(feature = "isolation")]
use std::sync::Arc;
use millennium_utils::assets::{Assets, EmbeddedAssets};
use serde::Serialize;
use serialize_to_javascript::{default_template, Template};
#[derive(Debug, Clone)]
pub enum Pattern<A: Assets = EmbeddedAssets> {
Brownfield(PhantomData<A>),
#[cfg(feature = "isolation")]
Isolation {
assets: Arc<A>,
schema: String,
key: String,
crypto_keys: Box<millennium_utils::pattern::isolation::Keys>
}
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "lowercase", tag = "pattern")]
pub(crate) enum PatternObject {
Brownfield,
#[cfg(feature = "isolation")]
Isolation {
side: IsolationSide
}
}
impl From<&Pattern> for PatternObject {
fn from(pattern: &Pattern) -> Self {
match pattern {
Pattern::Brownfield(_) => Self::Brownfield,
#[cfg(feature = "isolation")]
Pattern::Isolation { .. } => Self::Isolation { side: IsolationSide::default() }
}
}
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "lowercase")]
pub(crate) enum IsolationSide {
Original,
#[allow(dead_code)]
Secure
}
impl Default for IsolationSide {
fn default() -> Self {
Self::Original
}
}
#[derive(Template)]
#[default_template("../scripts/pattern.js")]
pub(crate) struct PatternJavascript {
pub(crate) pattern: PatternObject
}
#[allow(dead_code)]
pub(crate) fn format_real_schema(schema: &str) -> String {
if cfg!(windows) {
format!("https://{}.localhost", schema)
} else {
format!("{}://localhost", schema)
}
}