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