/* * This is the echoip-slatecave templating engine. * It wraps around tera in is specialized for echoip-slatecave. */ use axum::{ http::StatusCode, response::Html, response::IntoResponse, response::Response, response::Json, }; use tera::Tera; use toml::Table; use crate::simple_dns; use crate::IpResult; use crate::IpQuery; use crate::DigQuery; /* Response format */ #[derive(serde::Deserialize, serde::Serialize, Clone, Copy)] pub enum ResponseFormat { #[serde(rename="text/plain", alias="text")] TextPlain, #[serde(rename="text/html", alias="html")] TextHtml, #[serde(rename="application/json", alias="json")] ApplicationJson, } impl ToString for ResponseFormat { fn to_string(&self) -> String { match self { ResponseFormat::TextPlain => "text/plain", ResponseFormat::TextHtml => "text/html", ResponseFormat::ApplicationJson => "application/json", }.to_string() } } /* Template Settings */ #[derive(serde::Deserialize, serde::Serialize, Clone)] pub struct TemplateSettings { pub format: ResponseFormat, pub lang: String, } /* The echoip view */ #[derive(serde::Deserialize, serde::Serialize, Clone)] #[serde(untagged)] pub enum View { Dig { query: DigQuery, result: simple_dns::DnsLookupResult }, Index { query: IpQuery, result: IpResult }, Ip { query: IpQuery, result: IpResult }, Message(String), #[serde(rename="404")] NotFound, } impl View { pub fn template_name(&self) -> String { match self { View::Dig{..} => "dig", View::Index{..} => "index", View::Ip{..} => "ip", View::Message(..) => "message", View::NotFound => "404", }.to_string() } } /* The engine itself */ #[derive(Clone)] pub struct Engine { pub tera: Tera, pub template_config: Option