add: base project files

This commit is contained in:
lily 2025-03-28 01:33:23 -04:00
commit 74faf8fcc9
Signed by: lily
GPG key ID: 601F3263FBCBC4B9
9 changed files with 174 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
target/

14
Cargo.lock generated Normal file
View file

@ -0,0 +1,14 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "consumer"
version = "0.1.0"
dependencies = [
"kosmora",
]
[[package]]
name = "kosmora"
version = "0.1.0"

22
Cargo.toml Normal file
View file

@ -0,0 +1,22 @@
[workspace]
resolver = "2"
members = ["consumer", "kosmora"]
[profile.dev]
rpath = false
panic = "abort"
lto = "off"
opt-level = 0
debug = true
overflow-checks = false
incremental = true
codegen-units = 128
strip = "symbols"
debug-assertions = true
[profile.release]
debug-assertions = false
lto = true
codegen-units = 1
panic = "abort"

1
consumer/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

7
consumer/Cargo.toml Normal file
View file

@ -0,0 +1,7 @@
[package]
name = "consumer"
version = "0.1.0"
edition = "2024"
[dependencies]
kosmora = { path = "../kosmora" }

9
consumer/src/main.rs Normal file
View file

@ -0,0 +1,9 @@
use kosmora::{self, KosmoraINodeInteroperable};
use std::path::Path;
fn main() {
let vfs = kosmora::KosmoraVfs::new();
let example_path: &Path = &std::path::Path::new(".");
example_path.to_kosmora_inode();
}

1
kosmora/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

6
kosmora/Cargo.toml Normal file
View file

@ -0,0 +1,6 @@
[package]
name = "kosmora"
version = "0.1.0"
edition = "2024"
[dependencies]

113
kosmora/src/lib.rs Normal file
View file

@ -0,0 +1,113 @@
use std::boxed::Box;
pub struct KosmoraVfs {
index: KosmoraIndex,
packages: Vec<KosmoraPackage>
}
struct KosmoraIndex {
index: Vec<KosmoraPackage>
}
struct KosmoraPackage {
id: usize,
inode_index: KosmoraDirectory
}
pub enum KosmoraINodeType {
File(KosmoraFile),
Directory(KosmoraDirectory)
}
pub struct KosmoraFileMetadata {
name: String,
extension: Option<String>,
size: usize,
}
pub struct KosmoraFile {
metadata: KosmoraFileMetadata,
data: Vec<u8>
}
pub struct KosmoraDirectory {
name: String,
parent: Option<Box<KosmoraDirectory>>,
children: Option<Box<KosmoraINode>>
}
pub struct KosmoraINode {
inode: KosmoraINodeType
}
impl KosmoraVfs {
pub fn new() -> Self {
KosmoraVfs {
index: KosmoraIndex { index: Vec::new() },
packages: Vec::new()
}
}
pub fn create_directory(virtual_path: &str) {}
pub fn add_directory(real_path: &str, virtual_path: &str) {}
pub fn add_file(real_path: &str, virtual_path: &str) {}
}
pub trait KosmoraINodeInteroperable {
fn collect_directory_children(&self) -> KosmoraINode;
fn to_kosmora_inode(&self) -> KosmoraINode;
}
impl KosmoraINodeInteroperable for std::path::Path {
fn collect_directory_children(&self) -> KosmoraINode {
if !self.exists() || !self.is_dir() {
panic!("nuh uh that isnt allowed")
}
dbg!(self);
match std::fs::File::open(&self) {
Ok(file) => {
todo!()
},
Err(e) => {
eprintln!("{e}");
todo!()
}
}
}
fn to_kosmora_inode(&self) -> KosmoraINode {
if !self.exists() {
panic!("Path does not exist");
}
if self.is_dir() {
let dir = KosmoraDirectory {
name: self.components().last().unwrap().as_os_str().to_string_lossy().into(),
parent: None,
children: Some(Box::new(self.collect_directory_children())),
};
return KosmoraINode { inode: KosmoraINodeType::Directory(dir) };
}
if self.is_file() {
let meta = self.metadata()
.map_err(|_| panic!("Failed to get metadata"))
.ok()
.expect("Failed to get metadata");
let file_metadata = KosmoraFileMetadata {
name: String::from(self.file_name().unwrap().to_str().unwrap().to_string()),
extension: Some(self.file_name().unwrap().to_str().unwrap().split(".").last().unwrap().to_string()),
size: meta.len() as usize,
};
let file = KosmoraFile {
metadata: file_metadata,
data: std::fs::read(self).unwrap(),
};
return KosmoraINode { inode: KosmoraINodeType::File(file) }
}
panic!("Unsupported path type");
}
}