novel_cli/cmd/
template.rs

1use std::path::PathBuf;
2
3use clap::Args;
4use color_eyre::eyre::Result;
5use fluent_templates::Loader;
6use image::ImageReader;
7
8use super::Convert;
9use crate::utils::{self, Chapter, Content, Novel, Volume};
10use crate::{LANG_ID, LOCALES, renderer};
11
12#[must_use]
13#[derive(Args)]
14#[command(arg_required_else_help = true,
15    about = LOCALES.lookup(&LANG_ID, "template_command"))]
16pub struct Template {
17    #[arg(help = LOCALES.lookup(&LANG_ID, "novel_name"))]
18    pub novel_name: String,
19
20    #[arg(long, help = LOCALES.lookup(&LANG_ID, "cover_image"))]
21    pub cover_image: Option<PathBuf>,
22
23    #[arg(short, long, value_enum, value_delimiter = ',',
24        help = LOCALES.lookup(&LANG_ID, "converts"))]
25    pub converts: Vec<Convert>,
26}
27
28pub fn execute(config: Template) -> Result<()> {
29    let chapter = Chapter {
30        id: 0,
31        title: String::from("Chapter 1"),
32        contents: Some(vec![
33            Content::Text(String::from("◇◇◇")),
34            Content::Text(String::from("![](001.webp)")),
35        ]),
36    };
37
38    let volume = Volume {
39        title: String::from("Volume 1"),
40        chapters: vec![chapter],
41    };
42
43    let cover_image = if config.cover_image.is_some() {
44        let image = ImageReader::open(config.cover_image.unwrap())?
45            .with_guessed_format()?
46            .decode()?;
47        Some(image)
48    } else {
49        None
50    };
51
52    let mut novel = Novel {
53        name: config.novel_name,
54        author_name: String::from("TODO"),
55        introduction: Some(vec![String::from("line 1"), String::from("line 2")]),
56        cover_image,
57        volumes: vec![volume],
58    };
59
60    utils::convert(&mut novel, &config.converts)?;
61
62    renderer::generate_pandoc_markdown(novel, config.converts)?;
63
64    Ok(())
65}