1use clap::Parser;
2use std::{
3 fs::{read_to_string, write},
4 io::{self},
5 path::PathBuf,
6};
7
8#[derive(Debug, Parser)]
13#[command(author, version, about, long_about = None)]
14pub struct Cli {
15 pub input: String,
17 #[arg(short, long)]
19 pub file: bool,
20 #[arg(short, long)]
22 pub output: Option<PathBuf>,
23 #[arg(short, long)]
25 pub line_by_line: bool,
26}
27
28#[inline]
30#[must_use]
31pub fn encode(s: &str) -> String {
32 s.chars().rev().collect()
33}
34#[inline]
38#[must_use]
39pub fn encode_string(s: &str) -> String {
40 encode(s)
41}
42
43pub fn encode_file(path: impl Into<PathBuf>, line_by_line: bool) -> io::Result<String> {
49 let path = path.into();
50 let content = read_to_string(path)?;
51 if line_by_line {
52 return Ok(content
53 .lines()
54 .map(encode)
55 .collect::<Vec<String>>()
56 .join("\n"));
57 }
58 Ok(encode(&content))
59}
60
61pub fn process_input(cli: &Cli) -> io::Result<Option<String>> {
66 let result = if cli.file {
67 encode_file(&cli.input, cli.line_by_line)?
68 } else {
69 encode_string(&cli.input)
70 };
71
72 if let Some(output_path) = &cli.output {
73 write(output_path, result)?;
74 return Ok(None);
75 }
76 Ok(Some(result))
77}