hotovka prve

This commit is contained in:
Priec
2026-02-02 19:33:39 +01:00
parent c778552b1a
commit 1d2a9290bb
3 changed files with 110 additions and 15 deletions

View File

@@ -1,4 +1,4 @@
// src/lib.rs // src/lib.rs
pub mod logic; pub mod logic;
pub use logic::*; pub use logic::Kniznica;

View File

@@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
use std::fmt; use std::fmt;
#[derive(Default, Serialize, Deserialize, PartialEq)] #[derive(Default, Serialize, Deserialize, PartialEq)]
enum Stav { pub enum Stav {
#[default] Nova = 0, #[default] Nova = 0,
Pouzivana = 1, Pouzivana = 1,
Poskodena = 2, Poskodena = 2,
@@ -23,7 +23,7 @@ impl fmt::Display for Stav {
} }
#[derive(Default, Serialize, Deserialize)] #[derive(Default, Serialize, Deserialize)]
struct Kniha { pub struct Kniha {
autori: Vec<String>, autori: Vec<String>,
nazov: String, nazov: String,
vydavatelstvo: String, vydavatelstvo: String,
@@ -61,13 +61,13 @@ impl fmt::Display for Kniha {
#[derive(Default, Serialize, Deserialize)] #[derive(Default, Serialize, Deserialize)]
struct Kniznica { pub struct Kniznica {
knihy: Vec<Kniha> knihy: Vec<Kniha>
} }
impl Kniznica { impl Kniznica {
// Asociovana funkcia // Asociovana funkcia
fn nacitaj_zo_suboru(cesta: &std::path::PathBuf) -> Option<Self>{ pub fn nacitaj_zo_suboru(cesta: &std::path::PathBuf) -> Option<Self>{
let obsah = match std::fs::read_to_string(cesta) { let obsah = match std::fs::read_to_string(cesta) {
Ok(text) => text, Ok(text) => text,
Err(_) => return None, Err(_) => return None,
@@ -79,7 +79,7 @@ impl Kniznica {
Some(kniznica) Some(kniznica)
} }
// Metoda // 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) { let converted = match serde_json::to_string(&self) {
Ok(k) => k, Ok(k) => k,
Err(_) => return false, 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 { for x in &self.knihy {
if x.isbn == nova_kniha.isbn { if x.isbn == nova_kniha.isbn {
return Err(()); return Err(());
@@ -100,7 +100,7 @@ impl Kniznica {
Ok(()) 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() let moze = self.knihy.iter()
.all(|x| x.isbn != nova_kniha.isbn); .all(|x| x.isbn != nova_kniha.isbn);
if moze { if moze {
@@ -111,7 +111,7 @@ impl Kniznica {
Ok(()) Ok(())
} }
fn odstran_knihu(&mut self, isbn: &str) -> Result<Kniha, ()> { pub fn odstran_knihu(&mut self, isbn: &str) -> Result<Kniha, ()> {
if let Some(index) = self.knihy.iter() if let Some(index) = self.knihy.iter()
.position(|x| x.isbn == isbn) { .position(|x| x.isbn == isbn) {
let kniha = self.knihy.remove(index); 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) { if let Some(vrat) = self.knihy.iter().find(|x| x.isbn == isbn) {
return Some(vrat); return Some(vrat);
} }
None 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() 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 <K, V> kde K moze byt string a V pocet // hashmap obsahuje <K, V> kde K moze byt string a V pocet
let mut mapa = std::collections::HashMap::new(); let mut mapa = std::collections::HashMap::new();
for k in &self.knihy { 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(); let k: Vec<_> = self.knihy.iter().filter(|x| x.zaner == zaner_st).collect();
for x in k { for x in k {
println!("{}", x); println!("{}", x);

View File

@@ -1,3 +1,93 @@
fn main() { // src/main.rs
println!("Hello, world!"); 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);
}
},
}
} }