bootstrap-sona 1.0.1

A simple bootstrap 5 .well-known/fursona viewer
use handlebars::Handlebars;
use serde_json::json;
pub mod types;

pub fn home(theme: String) -> String {
    let reg = Handlebars::new();
    let template = include_str!("templates/home.hbs");
    let mut color = "#000000";
    if theme == "dark" {
        color = "#FFFFFF";
    }
    let page = reg.render_template(template, &json!({"theme": theme, "color": color}));
    page.expect("Couldn't render")
}

pub fn error(message: impl Into<String>, theme: String) -> String {
    let message = message.into();
    let reg = Handlebars::new();
    let template = include_str!("templates/error.hbs");
    let page = reg.render_template(template, &json!({"theme": theme, "message": message}));
    page.expect("Couldn't render")
}

pub fn card(sona: types::Sona, i: i32) -> String {
    let reg = Handlebars::new();
    let template = include_str!("templates/card.hbs");
    let template_color = include_str!("templates/cardColor.hbs");
    let template_avatar = include_str!("templates/cardAvatar.hbs");
    let template_ref = include_str!("templates/cardRefsheetButton.hbs");
    let template_gallery_item = include_str!("templates/cardGalleryItem.hbs");
    let template_gallery = include_str!("templates/cardGallery.hbs");

    // JSON parsing
    let mut colors = "".to_owned();
    let mut extra: Vec<String> = vec![];
    let mut age: Option<String> = None;
    let mut description = "".to_owned();
    let mut avataralt = "".to_owned();
    let mut avatar = "".to_owned();
    let mut refsheet = "".to_owned();
    let mut gallery = "".to_owned();
    if let Some(c) = sona.colors {
        for color in c {
            colors = colors + reg.render_template(template_color, &json!({"color": color})).expect("Couldn't render").as_str();
        }
    }
    if let Some(aa) = sona.avatarAlt { avataralt = aa; }
    if let Some(a) = sona.avatar {
        avatar = reg.render_template(template_avatar, &json!({"url": a, "alt": avataralt})).expect("Couldn't render");
    }
    if let Some(r) = sona.r#ref {
        refsheet = reg.render_template(template_ref, &json!({"url": r})).expect("Couldn't render");
    }
    if let Some(g) = sona.gallery {
        let mut is_first = true;
        let mut gallery_items = "".to_owned();
        for image in g {
            let mut extra_class = "";
            if is_first {
                extra_class = "active";
            }
            let gctx = json!({
                "src": image.image,
                "alt": image.imageAlt,
                "description": image.description,
                "active": extra_class
            });
            gallery_items = gallery_items + reg.render_template(template_gallery_item, &gctx).expect("Couldn't render").as_str();
            is_first = false;
        }
        gallery = reg.render_template(template_gallery, &json!({"images": gallery_items, "i": i.to_string()})).expect("Couldn't render");
    }
    if let Some(a) = sona.age {age = Some(format!("<p>Age: {}</p>", a));}
    if let Some(p) = sona.pronouns { extra.push(p); }
    if let Some(g) = sona.gender { extra.push(g); }
    if let Some(s) = sona.species { extra.push(s); }
    if let Some(d) = sona.description { description = d }

    let ctx = json!({
        "colors": colors,
        "name": sona.name,
        "extra": extra.join(""),
        "age": age,
        "description": description,
        "avatar": avatar,
        "ref": refsheet,
        "gallery": gallery
    });

    // Render
    reg
        .render_template(template, &ctx)
        .expect("Couldn't render")
}

pub fn cardpage(theme: String, url: String, html: String) -> String {
    let reg = Handlebars::new();
    let template = include_str!("templates/cardPage.hbs");
    reg
        .render_template(template, &json!({"theme": theme, "content": html, "url": url}))
        .expect("Couldn't render")
}