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