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::{
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")),
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}