created a tablerow struct

This commit is contained in:
Liam Fitzpatrick 2024-04-09 19:43:05 -04:00
parent 3897781f9c
commit 1344f1580d
4 changed files with 98 additions and 42 deletions

55
src/collection.rs Normal file
View File

@ -0,0 +1,55 @@
use serde::{Deserialize, Serialize};
use serde::de::DeserializeOwned;
use bson::{bson, Bson, doc, Document};
use std::fs::File;
use std::io::{BufReader, Seek, Write, Read};
use std::error::Error;
pub struct Collection<T>
{
pub entries: Vec<T>
}
impl<T> Collection<T>{
fn get(&self) -> Option<&T>{
self.entries.get(0)
}
fn new(&mut self, entries: Vec<T>){
self.entries = entries;
}
}
impl<T> Collection<T>
where
T : Serialize
{
pub fn save<W>(&self, mut writer : W) -> Result<(), Box<dyn Error>>
where W : Write {
for a in self.entries.iter(){
let d = bson::to_document(a)?;
d.to_writer(&mut writer)?;
}
Ok(())
}
}
impl<T> Collection<T>
where
T: DeserializeOwned
{
pub fn load(&mut self, mut file: File) -> Result<(), Box<dyn Error>>{
let n = file.metadata()?.len();
let mut reader = BufReader::new(file);
let mut current_position = reader.stream_position()?;
while current_position < n{
let d = Document::from_reader(&mut reader)?;
let h: T = bson::from_document(d)?;
self.entries.push(h);
current_position = reader.stream_position()?;
}
Ok(())
}
}

2
src/lib.rs Normal file
View File

@ -0,0 +1,2 @@
pub mod collection;
pub mod table;

View File

@ -1,52 +1,26 @@
use serde::{Deserialize, Serialize};
use serde::de::DeserializeOwned;
use bson::{bson, Bson, doc, Document};
use std::fs::File;
use std::io::{BufReader, Seek, Write, Read};
use std::error::Error;
use serde::{Deserialize, Serialize};
struct Collection<T>
{
entries: Vec<T>
mod collection;
#[derive(Serialize, Deserialize)]
struct Potato {
bob: f64
}
impl<T> Collection<T>{
fn get(&self) -> Option<&T>{
self.entries.get(0)
}
}
fn main() {
// let mut peeps: collection::Collection<Potato> = collection::Collection{entries: Vec::new()};
impl<T> Collection<T>
where
T : Serialize
{
fn save<W>(&self, mut writer : W) -> Result<(), Box<dyn Error>>
where W : Write {
for a in self.entries.iter(){
let d = bson::to_document(a)?;
d.to_writer(&mut writer)?;
}
Ok(())
}
// peeps.entries.push(Potato{bob:12.0});
// peeps.entries.push(Potato{bob:42.0});
// let mut file = File::create("test.bson").unwrap();
// peeps.save(file).unwrap();
}
let mut pops: collection::Collection<Potato> = collection::Collection { entries: Vec::new() };
impl<T> Collection<T>
where
T: DeserializeOwned
{
fn load(&mut self, mut file: File) -> Result<(), Box<dyn Error>>{
let n = file.metadata()?.len();
let mut reader = BufReader::new(file);
let mut current_position = reader.stream_position()?;
while current_position < n{
let d = Document::from_reader(&mut reader)?;
let h: T = bson::from_document(d)?;
self.entries.push(h);
current_position = reader.stream_position()?;
}
Ok(())
let mut file = File::open("test.bson").unwrap();
pops.load(file).unwrap();
}
println!("blah");
}

25
src/table.rs Normal file
View File

@ -0,0 +1,25 @@
use std::fs::File;
use serde::{Serialize};
use std::error::Error;
use crate::collection::Collection;
struct TableRow {
id: u32,
name: String,
num_entries: u32,
path: String
}
impl TableRow
{
fn new<T:Serialize>(&mut self, id : u32, name: String, entry: Collection<T>) -> Result<(), Box<dyn Error>>{
self.id = id;
self.name = name.clone();
self.num_entries = u32::try_from(entry.entries.len()).unwrap();
self.path = format!("{}.bson",name.clone());
let mut file = File::create(self.path.clone()).unwrap();
entry.save(file)?;
Ok(())
}
}