Skip to content

Commit

Permalink
refactor!: separate lib and cli (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
comfysage authored Jun 10, 2024
1 parent fbcdd9f commit 8203728
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 100 deletions.
110 changes: 110 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
use textwrap::wrap;

use unicode_width::UnicodeWidthStr;

pub static KITTY: &str = "
/l、
(゚、 。 7
l ~ヽ
じしf_,)ノ
";

pub struct FormatOptions {
pub think: bool,
pub width: u16,
}

struct Chars {
arrow: &'static str,
top: &'static str,
bottom: &'static str,
left: &'static str,
right: &'static str,
single_left: &'static str,
single_right: &'static str,
angled_up_right: &'static str,
angled_up_left: &'static str,
angled_down_right: &'static str,
angled_down_left: &'static str,
}

static SAY_CHARS: Chars = Chars {
arrow: "\\",
top: "-",
bottom: "-",
left: "|",
right: "|",
single_left: "<",
single_right: ">",
angled_up_right: "/",
angled_up_left: "\\",
angled_down_right: "\\",
angled_down_left: "/",
};

static THINK_CHARS: Chars = Chars {
arrow: "○",
top: "⏜",
bottom: "⏝",
left: "(",
right: ")",
single_left: "(",
single_right: ")",
angled_up_right: "⎛",
angled_up_left: "⎞",
angled_down_right: "⎝",
angled_down_left: "⎠",
};
pub fn generate(message: &str, format_opts: FormatOptions) -> String {
let think = format_opts.think;
let width = format_opts.width;

let chars = if think { &THINK_CHARS } else { &SAY_CHARS };
let mut lines = wrap(&message, width as usize);
let longest = lines.iter().map(|line| line.width()).max().unwrap();
return format!(
"
{}
{}
{}
{}
{}",
chars.top.repeat(longest),
if lines.len() == 1 {
format!("{} {} {}", chars.single_left, lines[0], chars.single_right)
} else {
let mut result = format!(
"{} {}{}{}",
chars.angled_up_right,
lines[0],
" ".repeat(longest - lines[0].width() + 1),
chars.angled_up_left
);
lines.remove(0);
let last = lines.pop().unwrap();

for line in lines {
result = format!(
"{}\n{} {}{}{}",
result,
chars.left,
line,
" ".repeat(longest - line.width() + 1),
chars.right,
);
}

format!(
"{}\n{} {}{}{}",
result,
chars.angled_down_right,
last,
" ".repeat(longest - last.width() + 1),
chars.angled_down_left,
)
},
chars.bottom.repeat(longest),
chars.arrow,
chars.arrow,
);
}
107 changes: 7 additions & 100 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,7 @@ use clap_stdin::MaybeStdin;

use crossterm::terminal;

use textwrap::wrap;
use unicode_width::UnicodeWidthStr;

struct Chars {
arrow: &'static str,
top: &'static str,
bottom: &'static str,
left: &'static str,
right: &'static str,
single_left: &'static str,
single_right: &'static str,
angled_up_right: &'static str,
angled_up_left: &'static str,
angled_down_right: &'static str,
angled_down_left: &'static str,
}

static SAY_CHARS: Chars = Chars {
arrow: "\\",
top: "-",
bottom: "-",
left: "|",
right: "|",
single_left: "<",
single_right: ">",
angled_up_right: "/",
angled_up_left: "\\",
angled_down_right: "\\",
angled_down_left: "/",
};

static THINK_CHARS: Chars = Chars {
arrow: "○",
top: "⏜",
bottom: "⏝",
left: "(",
right: ")",
single_left: "(",
single_right: ")",
angled_up_right: "⎛",
angled_up_left: "⎞",
angled_down_right: "⎝",
angled_down_left: "⎠",
};
use kittysay::{generate, FormatOptions, KITTY};

#[derive(Parser)]
#[command(version, about)]
Expand All @@ -73,56 +30,13 @@ fn main() -> Result<()> {
let (cols, _) = terminal::size()?;

let width = args.width.unwrap_or(45).min(cols.saturating_sub(5));
let chars = if args.think { &THINK_CHARS } else { &SAY_CHARS };

let mut lines = wrap(&args.message, width as usize);
let longest = lines.iter().map(|line| line.width()).max().unwrap();
let format_opts = FormatOptions {
think: args.think,
width,
};

let msg = format!(
"
{}
{}
{}
{}
{}",
chars.top.repeat(longest),
if lines.len() == 1 {
format!("{} {} {}", chars.single_left, lines[0], chars.single_right)
} else {
let mut result = format!(
"{} {}{}{}",
chars.angled_up_right,
lines[0],
" ".repeat(longest - lines[0].width() + 1),
chars.angled_up_left
);
lines.remove(0);
let last = lines.pop().unwrap();

for line in lines {
result = format!(
"{}\n{} {}{}{}",
result,
chars.left,
line,
" ".repeat(longest - line.width() + 1),
chars.right,
);
}

format!(
"{}\n{} {}{}{}",
result,
chars.angled_down_right,
last,
" ".repeat(longest - last.width() + 1),
chars.angled_down_left,
)
},
chars.bottom.repeat(longest),
chars.arrow,
chars.arrow,
);
let msg = generate(&args.message, format_opts);

let mut msg_color = console::Color::White;
let mut cat_color = console::Color::White;
Expand All @@ -131,17 +45,10 @@ fn main() -> Result<()> {
cat_color = console::Color::Color256(colors[1]);
}

let cat = "
/l、
(゚、 。 7
l ~ヽ
じしf_,)ノ
";

println!(
"{}{}",
console::style(msg).fg(msg_color),
console::style(cat).fg(cat_color)
console::style(KITTY).fg(cat_color)
);

Ok(())
Expand Down

0 comments on commit 8203728

Please sign in to comment.