use maud;
use mime::Mime;
use poem_openapi::types::ToJSON;
use quilt_rs::Manifest;
use serde_json;
use syntect::highlighting::ThemeSet;
use syntect::html;
use syntect::parsing::SyntaxSet;
pub async fn get_manifest_from_uri(uri: String) -> Manifest {
let client = quilt_rs::Client::new();
let manifest_wrap = client.manifest3_from_uri(uri).await;
let manifest = manifest_wrap.unwrap();
manifest
}
pub async fn json_manifest_from_uri(uri: String) -> Result<serde_json::Value, serde_json::Error> {
let manifest: Manifest = get_manifest_from_uri(uri).await;
serde_json::to_value(manifest)
}
fn highlight_json(json_raw: serde_json::Value) -> Result<String, syntect::Error> {
let syntax_set = SyntaxSet::load_defaults_newlines();
let theme_set = ThemeSet::load_defaults();
let theme = &theme_set.themes["InspiredGitHub"];
let lang = &syntax_set.find_syntax_by_extension("json").unwrap();
let json_prettified = serde_json::to_string_pretty(&json_raw).unwrap();
html::highlighted_html_for_string(&json_prettified, &syntax_set, &lang, theme)
}
pub async fn html_manifest_from_uri(uri: String) -> Result<String, syntect::Error> {
let raw_json = json_manifest_from_uri(uri).await.unwrap();
let json_highlighted = highlight_json(raw_json).unwrap();
Ok(json_highlighted)
}
pub async fn get_manifest_as_type(uri: String, mime: Mime) -> String {
match mime {
mime if mime == mime::TEXT_HTML => {
let markup = view(uri).await;
let view_html = crate::views::markup_to_html(markup);
view_html.to_string()
}
mime if mime == mime::APPLICATION_JSON => {
let json_manifest = json_manifest_from_uri(uri).await.unwrap();
json_manifest.to_json_string()
}
_ => {
let manifest = get_manifest_from_uri(uri).await;
format!("{:?}", manifest)
}
}
}
pub async fn view(uri: String) -> maud::Markup {
let json_highlighted = html_manifest_from_uri(uri).await.unwrap();
maud::html! {
(maud::PreEscaped(json_highlighted))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_get_manifest_from_uri() {
let uri_string: &str = "quilt+s3://quilt-example#package=akarve/test_dest";
let manifest = get_manifest_from_uri(uri_string.to_string()).await;
assert_eq!(manifest.rows.len(), 1);
let raw_json = serde_json::to_value(manifest).unwrap();
assert!(raw_json["header"].is_object());
let json_highlighted = highlight_json(raw_json).unwrap();
assert!(json_highlighted.contains("quilt-example"));
}
}