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