Add export command

This commit is contained in:
Joscha 2024-12-31 15:38:03 +01:00
parent c573f1b0b0
commit 535d7ff236
4 changed files with 20 additions and 48 deletions

View file

@ -1,3 +1,4 @@
pub mod export;
pub mod ingest; pub mod ingest;
pub mod path; pub mod path;
pub mod show; pub mod show;

View file

@ -0,0 +1,17 @@
use std::{io, path::PathBuf};
use crate::data::Data;
#[derive(Debug, clap::Parser)]
pub struct Cmd {
out: PathBuf,
}
impl Cmd {
pub fn run(self, data: Data) -> io::Result<()> {
println!(">> Export");
data.write_to_file(&self.out)?;
Ok(())
}
}

View file

@ -1,48 +0,0 @@
use std::fs::File;
use std::io::{self, BufReader, BufWriter};
use std::path::Path;
use crate::data::adjacency_list::AdjacencyList;
use crate::data::store;
pub fn reexport(
from: &Path,
to: &Path,
in_parens: Option<bool>,
in_structure: Option<bool>,
) -> io::Result<()> {
eprintln!(">> Import");
let mut from = BufReader::new(File::open(from)?);
let mut data = store::read_adjacency_list(&mut from)?;
eprintln!(">> Consistency check");
data.check_consistency();
if in_parens.is_some() || in_structure.is_some() {
eprintln!(">> Filtering");
let mut data2 = AdjacencyList::default();
for (page_idx, page) in data.pages() {
data2.push_page(page.data.clone());
for (_, link) in data.links(page_idx) {
if in_parens.is_some_and(|v| v != link.data.in_parens()) {
continue;
}
if in_structure.is_some_and(|v| v != link.data.in_structure()) {
continue;
}
data2.push_link(link.to, link.data);
}
}
data = data2;
}
eprintln!(">> Export");
let mut to = BufWriter::new(File::create(to)?);
store::write_adjacency_list(&data, &mut to)?;
Ok(())
}

View file

@ -12,6 +12,7 @@ use data::Data;
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
enum Command { enum Command {
Ingest(commands::ingest::Cmd), Ingest(commands::ingest::Cmd),
Export(commands::export::Cmd),
Show(commands::show::Cmd), Show(commands::show::Cmd),
Path(commands::path::Cmd), Path(commands::path::Cmd),
} }
@ -54,6 +55,7 @@ fn main() -> io::Result<()> {
match args.command { match args.command {
Command::Ingest(_) => unreachable!(), Command::Ingest(_) => unreachable!(),
Command::Export(cmd) => cmd.run(data),
Command::Show(cmd) => cmd.run(data), Command::Show(cmd) => cmd.run(data),
Command::Path(cmd) => cmd.run(data), Command::Path(cmd) => cmd.run(data),
} }