Skip to content

Commit 9ef5d51

Browse files
authored
[Feat::CLI] supports that users can defined their own config to generate snapshot (#8)
1 parent f95553d commit 9ef5d51

File tree

5 files changed

+83
-66
lines changed

5 files changed

+83
-66
lines changed

cli/src/code.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@ use codesnap::config::{Breadcrumbs, Code, CodeBuilder, HighlightLine};
55

66
use crate::CLI;
77

8-
pub fn create_code(cli: &CLI) -> anyhow::Result<Code> {
8+
pub fn create_code(cli: &CLI, config_code: Code) -> anyhow::Result<Code> {
99
let code_snippet = get_code_snippet(cli)?;
10-
let mut code_builder = CodeBuilder::default();
11-
let mut code = code_builder
12-
.content(&code_snippet)
13-
.theme(&cli.code_theme)
14-
.font_family(&cli.code_font_family)
15-
.build()?;
10+
let mut code_builder = CodeBuilder::from_code(config_code.clone());
11+
let mut code = code_builder.content(&code_snippet).build()?;
1612

17-
code.file_path = cli.file.clone();
18-
code.language = cli.language.clone();
19-
code.breadcrumbs = create_breadcrumbs(&cli);
13+
code.theme = cli.code_theme.clone().unwrap_or(config_code.theme);
14+
code.font_family = cli
15+
.code_font_family
16+
.clone()
17+
.unwrap_or(config_code.font_family);
18+
code.file_path = cli.file.clone().or(config_code.file_path);
19+
code.language = cli.language.clone().or(config_code.language);
20+
code.breadcrumbs = create_breadcrumbs(&cli).or(config_code.breadcrumbs);
2021
code.highlight_lines = create_highlight_lines(&cli)?;
2122

2223
Ok(code)

cli/src/main.rs

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ mod logger;
33
mod watermark;
44
mod window;
55

6+
use std::fs::read_to_string;
7+
68
use clap::Parser;
79
use clap::Subcommand;
810
use code::create_code;
911
use codesnap::config::CodeSnap;
1012
use codesnap::config::SnapshotConfig;
11-
use codesnap::config::DEFAULT_WINDOW_MARGIN;
1213
use codesnap::snapshot::snapshot::Snapshot;
1314
use watermark::create_watermark;
1415
use window::create_window;
@@ -38,12 +39,12 @@ struct CLI {
3839
to_clipboard: bool,
3940

4041
/// Font family for the code snippet
41-
#[arg(long, default_value = "CaskaydiaCove Nerd Font")]
42-
code_font_family: String,
42+
#[arg(long)]
43+
code_font_family: Option<String>,
4344

4445
/// Code theme for the code snippet
45-
#[arg(long, default_value = "base16-ocean.dark")]
46-
code_theme: String,
46+
#[arg(long)]
47+
code_theme: Option<String>,
4748

4849
/// Breadcrumbs is a useful and unique feature in CodeSnap, it shows the path of the file
4950
/// so that users can know where the code snippet comes from.
@@ -100,12 +101,12 @@ struct CLI {
100101
watermark_color: String,
101102

102103
/// Set window shadow radius
103-
#[arg(long, default_value_t = 20.)]
104-
shadow: f32,
104+
#[arg(long)]
105+
shadow: Option<f32>,
105106

106107
/// Display MacOS style window bar
107-
#[arg(long, default_value_t = true)]
108-
mac_window_bar: bool,
108+
#[arg(long)]
109+
mac_window_bar: Option<bool>,
109110

110111
/// Display window border
111112
#[arg(long, default_value_t = true)]
@@ -116,12 +117,12 @@ struct CLI {
116117
border_color: String,
117118

118119
/// Set horizontal margin of window
119-
#[arg(long, default_value_t = DEFAULT_WINDOW_MARGIN)]
120-
margin_x: f32,
120+
#[arg(long)]
121+
margin_x: Option<f32>,
121122

122123
/// Set vertical margin of window
123-
#[arg(long, default_value_t = DEFAULT_WINDOW_MARGIN)]
124-
margin_y: f32,
124+
#[arg(long)]
125+
margin_y: Option<f32>,
125126

126127
/// Set title of the window
127128
#[arg(long)]
@@ -155,6 +156,9 @@ struct CLI {
155156
/// To generate ASCII snapshot ranther than image snapshot
156157
#[arg(long)]
157158
ascii: bool,
159+
160+
#[arg(long)]
161+
config: Option<String>,
158162
}
159163

160164
#[derive(Subcommand)]
@@ -171,18 +175,24 @@ struct Args {
171175

172176
fn generate_snapshot() -> anyhow::Result<()> {
173177
let cli = CLI::parse();
174-
let code = create_code(&cli)?;
175-
let watermark = create_watermark(&cli)?;
176-
let window = create_window(&cli)?;
177-
let mut codesnap = CodeSnap::default()
178-
.code(code)
179-
.watermark(watermark)
180-
.window(window)
178+
179+
let mut codesnap_default = if let Some(ref config) = cli.config {
180+
let content = read_to_string(config)?;
181+
182+
CodeSnap::from_config(&content)?
183+
} else {
184+
CodeSnap::default()
185+
};
186+
187+
let mut codesnap = codesnap_default
188+
.map_code(|code| create_code(&cli, code))?
189+
.map_watermark(|watermark| create_watermark(&cli, watermark))?
190+
.map_window(|window| create_window(&cli, window))?
181191
.scale_factor(cli.scale_factor)
182192
.build()?;
183193

184-
codesnap.themes_folder = cli.themes_folder.clone();
185-
codesnap.fonts_folder = cli.fonts_folder.clone();
194+
codesnap.themes_folder = cli.themes_folder.clone().or(codesnap.themes_folder);
195+
codesnap.fonts_folder = cli.fonts_folder.clone().or(codesnap.fonts_folder);
186196

187197
if cli.ascii {
188198
execute(&cli, codesnap.create_ascii_snapshot()?, codesnap)?;

cli/src/watermark.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
1-
use codesnap::config::{Code, CodeBuilder, Watermark, WatermarkBuilder, Window};
1+
use codesnap::config::{Watermark, WatermarkBuilder};
22

33
use crate::CLI;
44

5-
pub fn create_watermark(cli: &CLI) -> anyhow::Result<Option<Watermark>> {
6-
if let Some(ref watermark) = cli.watermark {
7-
let mut watermark_builder = WatermarkBuilder::default();
8-
let watermark = watermark_builder
5+
pub fn create_watermark(
6+
cli: &CLI,
7+
config_watermark: Option<Watermark>,
8+
) -> anyhow::Result<Option<Watermark>> {
9+
if cli.watermark.is_none() && config_watermark.is_none() {
10+
return Ok(None);
11+
}
12+
13+
let watermark = if let Some(ref watermark) = cli.watermark {
14+
let watermark = WatermarkBuilder::default()
915
.color(&cli.watermark_color)
1016
.content(watermark)
1117
.font_family(&cli.watermark_font_family)
1218
.build()?;
1319

14-
return Ok(Some(watermark));
15-
}
20+
Some(watermark)
21+
} else {
22+
None
23+
};
1624

17-
Ok(None)
25+
Ok(config_watermark.or(watermark))
1826
}

cli/src/window.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
use codesnap::config::{Border, Code, CodeBuilder, Margin, TitleConfig, Window, WindowBuilder};
1+
use codesnap::config::{Border, Margin, TitleConfig, Window, WindowBuilder};
22

33
use crate::CLI;
44

5-
pub fn create_window(cli: &CLI) -> anyhow::Result<Window> {
6-
let mut window_builder = WindowBuilder::default();
7-
let mut window = window_builder
8-
.mac_window_bar(cli.mac_window_bar)
9-
.shadow(cli.shadow)
10-
.margin(Margin {
11-
x: cli.margin_x,
12-
y: cli.margin_y,
13-
})
14-
.build()?;
5+
pub fn create_window(cli: &CLI, config_window: Window) -> anyhow::Result<Window> {
6+
let mut window = WindowBuilder::from_window(config_window.clone()).build()?;
157

8+
window.margin = Margin {
9+
x: cli.margin_x.unwrap_or(config_window.margin.x),
10+
y: cli.margin_y.unwrap_or(config_window.margin.y),
11+
};
12+
window.shadow = cli.shadow.unwrap_or(config_window.shadow);
13+
window.mac_window_bar = cli.mac_window_bar.unwrap_or(config_window.mac_window_bar);
1614
window.title = create_title(cli);
1715
window.border = create_border(cli);
1816

core/src/config.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -348,35 +348,35 @@ impl CodeSnap {
348348
serde_json::from_str::<CodeSnap>(config)
349349
}
350350

351-
pub fn map_code<F>(&mut self, f: F) -> Result<&mut Self, CodeBuilderError>
351+
pub fn map_code<F>(&mut self, f: F) -> anyhow::Result<&mut Self>
352352
where
353-
F: Fn(Code) -> Result<Code, CodeBuilderError>,
353+
F: Fn(Code) -> anyhow::Result<Code>,
354354
{
355-
if let Some(ref code) = self.code {
356-
self.code = Some(f(code.clone())?);
357-
}
355+
self.code = Some(f(self
356+
.code
357+
.clone()
358+
.unwrap_or(CodeBuilder::default().content("").build()?))?);
358359

359360
Ok(self)
360361
}
361362

362-
pub fn map_window<F>(&mut self, f: F) -> Result<&mut Self, WindowBuilderError>
363+
pub fn map_window<F>(&mut self, f: F) -> anyhow::Result<&mut Self>
363364
where
364-
F: Fn(Window) -> Result<Window, WindowBuilderError>,
365+
F: Fn(Window) -> anyhow::Result<Window>,
365366
{
366-
if let Some(ref window) = self.window {
367-
self.window = Some(f(window.clone())?);
368-
}
367+
self.window = Some(f(self
368+
.window
369+
.clone()
370+
.unwrap_or(WindowBuilder::default().build()?))?);
369371

370372
Ok(self)
371373
}
372374

373-
pub fn map_watermark<F>(&mut self, f: F) -> Result<&mut Self, WatermarkBuilderError>
375+
pub fn map_watermark<F>(&mut self, f: F) -> anyhow::Result<&mut Self>
374376
where
375-
F: Fn(Option<Watermark>) -> Result<Watermark, WatermarkBuilderError>,
377+
F: Fn(Option<Watermark>) -> anyhow::Result<Option<Watermark>>,
376378
{
377-
if let Some(ref watermark) = self.watermark {
378-
self.watermark = Some(Some(f(watermark.clone())?));
379-
}
379+
self.watermark = Some(f(self.watermark.clone().unwrap_or(None))?);
380380

381381
Ok(self)
382382
}

0 commit comments

Comments
 (0)