cargo-gra 0.6.2

Cargo subcommand for gtk-rust-app.
Documentation
use std::fs::File;

use std::io::Write;
use std::path::PathBuf;

use std;

use std::path::Path;

use crate::ProjectDescriptor;

pub(crate) fn create_desktop_file(
    descriptor: &ProjectDescriptor,
    path: &Path,
) -> std::io::Result<()> {
    let template = include_str!("../../data/app.template.desktop");

    let app_desc = &descriptor.app;

    let mut path = PathBuf::from(path);
    path.push(format!("{}.desktop", app_desc.id));

    println!("[gra] Generate {:?}", path);
    let mut file = File::create(path)?;

    let generic_name = app_desc
        .generic_name
        .as_ref()
        .unwrap_or(&descriptor.package.name);

    file.write_all(
        template
            .replace("{id}", &app_desc.id)
            .replace(
                "{name}",
                descriptor
                    .app
                    .name
                    .as_ref()
                    .unwrap_or(&descriptor.package.name),
            )
            .replace("{generic_name}", generic_name)
            .replace("{summary}", &app_desc.summary)
            .replace("{categories}", &app_desc.categories.join(";"))
            .replace(
                "{mimetype}",
                app_desc.mimetype.as_ref().unwrap_or(&"".into()),
            )
            .replace(
                "{form_factor}",
                &app_desc
                    .requires
                    .iter()
                    .filter_map(|r| match r {
                        crate::Recommend::Display(d) => Some(d),
                        crate::Recommend::DisplayLength(d) => Some(d),
                        crate::Recommend::Control(_) => None,
                    })
                    .filter_map(|d| match d.as_str() {
                        "small" => Some("Mobile"),
                        ">360" => Some("Mobile"),
                        "large" => Some("Workstation"),
                        _ => None,
                    })
                    .collect::<Vec<&str>>()
                    .join(";"),
            )
            .as_bytes(),
    )?;
    Ok(())
}