This commit is contained in:
2026-03-25 00:37:16 +07:00
commit ef3db54945
4 changed files with 191 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
/target
Generated
+7
View File
@@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "notes-rust"
version = "0.1.0"
+6
View File
@@ -0,0 +1,6 @@
[package]
name = "notes-rust"
version = "0.1.0"
edition = "2024"
[dependencies]
+177
View File
@@ -0,0 +1,177 @@
use std::io::{self, Write};
struct Notes {
id: u32,
title: String,
content: Vec<String>,
}
impl Notes {
fn new(id: u32, title: String, content: Vec<String>) -> Notes {
Notes {
id,
title,
content
}
}
}
struct NotesCollection {
notes: Vec<Notes>,
next_id: u32,
}
impl NotesCollection {
fn new() -> NotesCollection {
NotesCollection {
notes: Vec::new(),
next_id: 1,
}
}
fn add(&mut self, title: String, content: Vec<String>) -> u32 {
let note = Notes::new(self.next_id, title, content);
let id = note.id;
self.notes.push(note);
self.next_id += 1;
id
}
fn remove(&mut self, id: u32) -> bool {
if let Some(pos) = self.notes.iter().position(|n| n.id == id) {
self.notes.remove(pos);
true
} else {
false
}
}
fn list(&self) -> Vec<(u32, &String)> {
self.notes.iter().map(|n| (n.id, &n.title)).collect()
}
fn count(&self) -> usize {
self.notes.len()
}
}
pub fn get_input(prompt: &str) -> String {
print!("{prompt}");
io::stdout().flush().expect("Failed to flush");
let mut input = String::new();
match io::stdin().read_line(&mut input) {
Ok(_) => {}
Err(e) => eprintln!("Error reading input: {e}"),
}
input.trim().to_string()
}
fn mode_add(collection: &mut NotesCollection) {
let title: String;
loop {
let temp_title = get_input("Set title: ");
if temp_title.is_empty() {
println!("Pls no empty title");
} else {
title = temp_title.to_string();
break;
}
}
let mut content: Vec<String> = Vec::new();
loop {
let item = get_input("Enter item (- to exit): ");
if item.is_empty() {
println!("Pls no empty item");
continue;
}
if item == "-" {
break;
}
content.push(item);
}
let id = collection.add(title, content);
println!("Note #{} saved!", id);
}
fn mode_delete(collection: &mut NotesCollection) {
if collection.count() == 0 {
println!("Nothing to delete bruh");
return;
}
for (id, title) in collection.list() {
println!("[{}] {}", id, title);
}
let input = get_input("Enter note ID to delete (- to cancel): ");
if input == "-" {
return;
}
match input.trim().parse::<u32>() {
Ok(id) => {
if collection.remove(id) {
println!("Note #{} deleted!", id);
} else {
println!("No note with the ID {}!!!", id);
}
}
Err(_) => println!("Invalid ID!"),
}
}
fn mode_view(collection: &NotesCollection) {
if collection.count() == 0 {
println!("Nothing here bruh");
return;
}
for note in &collection.notes {
println!("{}", note.title);
for item in &note.content {
println!(" - {}", item);
}
println!();
}
}
fn main() {
let mut notes: NotesCollection = NotesCollection::new();
loop {
let mode = get_input("Select mode (v | a | d): "); // view, add, delete
// println!("{mode}");
match mode.as_str() {
"a" => mode_add(&mut notes),
"d" => mode_delete(&mut notes),
"v" => mode_view(&notes),
"q" => break,
_ => {
println!("not a valid input");
continue
}
}
}
}