quilt-api 0.2.0

Non-web API for representing quilt4 data structures.
Documentation
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;
        // Add assertions here to validate the manifest
        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"));
    }
}