diff --git a/src/lib.rs b/src/lib.rs index 45c6cd8..e8dcd6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ // src/lib.rs pub mod logic; -pub use logic::*; +pub use logic::Kniznica; diff --git a/src/logic.rs b/src/logic.rs index 7a801ba..c2a5f74 100644 --- a/src/logic.rs +++ b/src/logic.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use std::fmt; #[derive(Default, Serialize, Deserialize, PartialEq)] -enum Stav { +pub enum Stav { #[default] Nova = 0, Pouzivana = 1, Poskodena = 2, @@ -23,7 +23,7 @@ impl fmt::Display for Stav { } #[derive(Default, Serialize, Deserialize)] -struct Kniha { +pub struct Kniha { autori: Vec, nazov: String, vydavatelstvo: String, @@ -61,13 +61,13 @@ impl fmt::Display for Kniha { #[derive(Default, Serialize, Deserialize)] -struct Kniznica { +pub struct Kniznica { knihy: Vec } impl Kniznica { // Asociovana funkcia - fn nacitaj_zo_suboru(cesta: &std::path::PathBuf) -> Option{ + pub fn nacitaj_zo_suboru(cesta: &std::path::PathBuf) -> Option{ let obsah = match std::fs::read_to_string(cesta) { Ok(text) => text, Err(_) => return None, @@ -79,7 +79,7 @@ impl Kniznica { Some(kniznica) } // Metoda - fn uloz_do_suboru(&self, cesta: &std::path::PathBuf) -> bool { + pub fn uloz_do_suboru(&self, cesta: &std::path::PathBuf) -> bool { let converted = match serde_json::to_string(&self) { Ok(k) => k, Err(_) => return false, @@ -90,7 +90,7 @@ impl Kniznica { }; } - fn pridaj_knihu(&mut self, nova_kniha: Kniha) -> Result<(), ()> { + pub fn pridaj_knihu(&mut self, nova_kniha: Kniha) -> Result<(), ()> { for x in &self.knihy { if x.isbn == nova_kniha.isbn { return Err(()); @@ -100,7 +100,7 @@ impl Kniznica { Ok(()) } - fn pridaj_knihu2(&mut self, nova_kniha: Kniha) -> Result<(), ()> { + pub fn pridaj_knihu2(&mut self, nova_kniha: Kniha) -> Result<(), ()> { let moze = self.knihy.iter() .all(|x| x.isbn != nova_kniha.isbn); if moze { @@ -111,7 +111,7 @@ impl Kniznica { Ok(()) } - fn odstran_knihu(&mut self, isbn: &str) -> Result { + pub fn odstran_knihu(&mut self, isbn: &str) -> Result { if let Some(index) = self.knihy.iter() .position(|x| x.isbn == isbn) { let kniha = self.knihy.remove(index); @@ -122,18 +122,23 @@ impl Kniznica { } - fn daj_knihu_podla_isbn(&self, isbn: &str) -> Option<&Kniha> { + pub fn daj_knihu_podla_isbn(&self, isbn: &str) -> Option<&Kniha> { if let Some(vrat) = self.knihy.iter().find(|x| x.isbn == isbn) { return Some(vrat); } None } - fn daj_knihy_podla_stavu(&self, stav_knihy: Stav) -> Vec<&Kniha> { + pub fn daj_knihy_podla_autora(&self, autor: &str) -> Vec<&Kniha> { + let vrat: Vec<&Kniha>= self.knihy.iter().filter(|x| x.autori.contains(&autor.to_string())).collect(); + vrat + } + + pub fn daj_knihy_podla_stavu(&self, stav_knihy: Stav) -> Vec<&Kniha> { self.knihy.iter().filter(|x| x.stav_knihy == stav_knihy).collect() } - fn vypis_vydavatelstva_a_pocet_knih(&self) { + pub fn vypis_vydavatelstva_a_pocet_knih(&self) { // hashmap obsahuje kde K moze byt string a V pocet let mut mapa = std::collections::HashMap::new(); for k in &self.knihy { @@ -152,7 +157,7 @@ impl Kniznica { } } - fn vypis_knihy_daneho_zanru(&self, zaner_st: &str) { + pub fn vypis_knihy_daneho_zanru(&self, zaner_st: &str) { let k: Vec<_> = self.knihy.iter().filter(|x| x.zaner == zaner_st).collect(); for x in k { println!("{}", x); diff --git a/src/main.rs b/src/main.rs index e7a11a9..f4be8b1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,93 @@ -fn main() { - println!("Hello, world!"); +// src/main.rs +use clap::{Parser, Subcommand}; +use priprava_na_skusku2::Kniznica; +use std::path::PathBuf; + +#[derive(Parser)] +#[command(name= "KniznicaApp")] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + DajKnihuIsbn { + #[arg(short, long)] + cesta: std::path::PathBuf, + #[arg(short, long)] + isbn: String, + }, + DajKnihyAutora { + #[arg(short, long)] + cesta: std::path::PathBuf, + #[arg(short, long)] + autor: String, + }, + OdstranKnihu { + #[arg(short, long)] + cesta: std::path::PathBuf, + #[arg(short, long)] + isbn: String, + }, + VypisVydavatelstva { + #[arg(short, long)] + cesta: std::path::PathBuf, + }, +} + +fn main() { + let args = Cli::parse(); + match args.command { + Commands::DajKnihuIsbn {cesta, isbn} => { + if let Some(kniznica) = Kniznica::nacitaj_zo_suboru(&cesta) { + if let Some(kniha) = kniznica.daj_knihu_podla_isbn(&isbn) { + println!("Nájdená kniha: {}", kniha); + } else { + println!("Kniha s ISBN {} sa nenašla.", isbn); + } + } else { + println!("Nepodarilo sa načítať súbor na ceste {:?}", cesta); + } + }, + Commands::DajKnihyAutora {cesta, autor} => { + if let Some(kniznica) = Kniznica::nacitaj_zo_suboru(&cesta) { + let k_a= kniznica.daj_knihy_podla_autora(&autor); + for kniha in k_a { + println!{"{}", kniha}; + } + + } else { + println!("Nepodarilo sa načítať subor {:?}", cesta); + } + + }, + Commands::OdstranKnihu {cesta, isbn} => { + if let Some(mut kniznica) = Kniznica::nacitaj_zo_suboru(&cesta) { + match kniznica.odstran_knihu(&isbn) { + Ok(vymazana) => { + println!("Úspešne odstránená kniha: {}", vymazana); + if kniznica.uloz_do_suboru(&cesta) { + println!("Zmeny boli uložené."); + } else { + println!("Chyba pri ukladaní súboru."); + } + }, + Err(_) => { + println!("Kniha s ISBN {} nebola nájdená.", isbn); + } + } + } else { + println!("Nepodarilo sa načítať subor {:?}", cesta); + } + }, + Commands::VypisVydavatelstva {cesta} => { + if let Some(kniznica) = Kniznica::nacitaj_zo_suboru(&cesta) { + kniznica.vypis_vydavatelstva_a_pocet_knih(); + } else { + println!("Nepodarilo sa načítať subor {:?}", cesta); + } + + }, + } }