novel_cli/cmd/
template.rs1use 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")),
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}