Start work on output collector
This commit is contained in:
parent
d3deecfb45
commit
2ea91652b7
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -15,6 +15,7 @@ dependencies = [
|
|||||||
"anyhow",
|
"anyhow",
|
||||||
"crossbeam",
|
"crossbeam",
|
||||||
"ncdufmt",
|
"ncdufmt",
|
||||||
|
"serde_json",
|
||||||
"tar",
|
"tar",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -15,4 +15,5 @@ members = [
|
|||||||
anyhow = "1.0.75"
|
anyhow = "1.0.75"
|
||||||
crossbeam = { version = "0.8.2", features = ["crossbeam-channel"] }
|
crossbeam = { version = "0.8.2", features = ["crossbeam-channel"] }
|
||||||
ncdufmt = {path="./ncdufmt/"}
|
ncdufmt = {path="./ncdufmt/"}
|
||||||
|
serde_json = "1.0.108"
|
||||||
tar = "0.4.40"
|
tar = "0.4.40"
|
||||||
|
@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
// This is based on https://dev.yorhel.nl/ncdu/jsonfmt
|
// This is based on https://dev.yorhel.nl/ncdu/jsonfmt
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
struct NcduFile {
|
pub struct NcduFile {
|
||||||
pub major_version: MajorVersion,
|
pub major_version: MajorVersion,
|
||||||
pub minor_version: MinorVersion,
|
pub minor_version: MinorVersion,
|
||||||
pub header_metadata: HeaderMetadata,
|
pub header_metadata: HeaderMetadata,
|
||||||
@ -125,10 +125,10 @@ pub struct HeaderMetadata {
|
|||||||
|
|
||||||
impl HeaderMetadata {
|
impl HeaderMetadata {
|
||||||
/// Construct a HeaderMetadata with the current time
|
/// Construct a HeaderMetadata with the current time
|
||||||
pub fn new(progname: String, progver: String) -> Self {
|
pub fn new(progname: impl AsRef<str>, progver: impl AsRef<str>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
progname,
|
progname: progname.as_ref().to_string(),
|
||||||
progver,
|
progver: progver.as_ref().to_string(),
|
||||||
timestamp: SystemTime::now()
|
timestamp: SystemTime::now()
|
||||||
.duration_since(SystemTime::UNIX_EPOCH)
|
.duration_since(SystemTime::UNIX_EPOCH)
|
||||||
.as_ref()
|
.as_ref()
|
||||||
@ -140,8 +140,8 @@ impl HeaderMetadata {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Directory {
|
pub struct Directory {
|
||||||
info: InfoBlock,
|
pub info: InfoBlock,
|
||||||
contents: Vec<FileOrDirectory>,
|
pub contents: Vec<FileOrDirectory>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Serialize for Directory {
|
impl Serialize for Directory {
|
||||||
@ -295,6 +295,24 @@ pub struct InfoBlock {
|
|||||||
pub extended_info_block: Option<ExtendedInfoBlock>,
|
pub extended_info_block: Option<ExtendedInfoBlock>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl InfoBlock {
|
||||||
|
pub fn new(name: impl AsRef<str>) -> Self {
|
||||||
|
Self {
|
||||||
|
name: name.as_ref().to_string(),
|
||||||
|
dev: Default::default(),
|
||||||
|
asize: Default::default(),
|
||||||
|
dsize: Default::default(),
|
||||||
|
hlnkc: Default::default(),
|
||||||
|
ino: Default::default(),
|
||||||
|
nlink: Default::default(),
|
||||||
|
read_error: Default::default(),
|
||||||
|
excluded: Default::default(),
|
||||||
|
notreg: Default::default(),
|
||||||
|
extended_info_block: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
|
||||||
pub struct ExtendedInfoBlock {
|
pub struct ExtendedInfoBlock {
|
||||||
/// Number, user ID who owns the file. Accepted values are in the range 0 <= uid < 2^31.
|
/// Number, user ID who owns the file. Accepted values are in the range 0 <= uid < 2^31.
|
||||||
|
51
src/collector.rs
Normal file
51
src/collector.rs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
use std::io::Write;
|
||||||
|
|
||||||
|
use crate::types;
|
||||||
|
use anyhow::Result;
|
||||||
|
use ncdufmt::{MajorVersion, MinorVersion, HeaderMetadata, InfoBlock, NcduFile, Directory, FileOrDirectory};
|
||||||
|
|
||||||
|
/// Builds an ncdu file from a stream
|
||||||
|
pub fn build_ncdu_file(rx: crossbeam::channel::Receiver<types::Entry>/*, _writer: impl Write*/) -> Result<NcduFile> {
|
||||||
|
let mut ret = NcduFile {
|
||||||
|
major_version: MajorVersion::default(),
|
||||||
|
minor_version: MinorVersion::default(),
|
||||||
|
header_metadata: HeaderMetadata::new("test-program", "0.1.1"),
|
||||||
|
contents: Directory {
|
||||||
|
info: InfoBlock::new("test-filename.tar".to_string()),
|
||||||
|
contents: Vec::default(),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
while let Ok(entry) = rx.recv() {
|
||||||
|
let mut e = InfoBlock::new(entry.path.to_string_lossy());
|
||||||
|
e.asize = entry.size;
|
||||||
|
ret.contents.contents.push(FileOrDirectory::File(e) );
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::fs::File;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn simple_tree() {
|
||||||
|
// Check that this tar file of mine has a Cargo.lock and 10 entries
|
||||||
|
let reader = File::open("./test-tar.tar").unwrap();
|
||||||
|
let (tx, rx) = crossbeam::channel::bounded(100);
|
||||||
|
|
||||||
|
crate::tar::get_entries(tx, reader).unwrap();
|
||||||
|
|
||||||
|
let ret = build_ncdu_file(rx).unwrap();
|
||||||
|
|
||||||
|
eprintln!("{ret:#?}");
|
||||||
|
eprintln!("{}", serde_json::to_string(&ret).unwrap());
|
||||||
|
|
||||||
|
panic!();
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
mod tar;
|
mod tar;
|
||||||
mod types;
|
mod types;
|
||||||
|
mod collector;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
println!("Hello, world!");
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ use tar::Archive;
|
|||||||
///
|
///
|
||||||
/// The tar file must be in a decompressed state
|
/// The tar file must be in a decompressed state
|
||||||
pub fn get_entries(
|
pub fn get_entries(
|
||||||
reader: impl Read,
|
|
||||||
tx: crossbeam::channel::Sender<types::Entry>,
|
tx: crossbeam::channel::Sender<types::Entry>,
|
||||||
|
reader: impl Read,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut archive = Archive::new(reader);
|
let mut archive = Archive::new(reader);
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ mod tests {
|
|||||||
let reader = File::open("./test-tar.tar").unwrap();
|
let reader = File::open("./test-tar.tar").unwrap();
|
||||||
let (tx, rx) = crossbeam::channel::bounded(100);
|
let (tx, rx) = crossbeam::channel::bounded(100);
|
||||||
|
|
||||||
get_entries(reader, tx).unwrap();
|
get_entries(tx, reader).unwrap();
|
||||||
|
|
||||||
let mut results = vec![];
|
let mut results = vec![];
|
||||||
while let Ok(entry) = rx.recv() {
|
while let Ok(entry) = rx.recv() {
|
||||||
|
Loading…
Reference in New Issue
Block a user