use rust_stdf::{
stdf_file::{StdfReader, StdfWriter},
ByteOrder, FAR, PTR,
};
use std::env;
use std::fs::File;
use std::io::BufWriter;
fn main() {
let args: Vec<String> = env::args().collect();
match args.as_slice() {
[_, out] => build_demo(out),
[_, input, out] => filter_copy(input, out),
_ => {
eprintln!("usage:\n stdf_write_example <out.stdf>\n stdf_write_example <in.stdf> <out.stdf>");
}
}
}
fn build_demo(out_path: &str) {
let file = File::create(out_path).expect("create output");
let mut writer = StdfWriter::new(BufWriter::new(file), ByteOrder::LittleEndian);
let mut far = FAR::new();
far.cpu_type = 2;
far.stdf_ver = 4;
writer.write_record(&far).expect("write FAR");
let mut ptr = PTR::new();
ptr.test_num = 1000;
ptr.head_num = 1;
ptr.site_num = 1;
ptr.test_flg = [0x00];
ptr.parm_flg = [0x00];
ptr.result = 1.234;
ptr.test_txt = "continuity".to_string();
writer.write_record(&ptr).expect("write PTR");
writer.flush().expect("flush");
println!("wrote {out_path}");
}
fn filter_copy(in_path: &str, out_path: &str) {
let mut reader = StdfReader::new(in_path).expect("open input");
const PTR_TYP: u8 = 15;
const PTR_SUB: u8 = 10;
let mut writer: Option<StdfWriter<BufWriter<File>>> = None;
let mut kept = 0usize;
let mut dropped = 0usize;
let mut iter = reader.get_rawdata_view_iter();
while let Some(item) = iter.next() {
let view = item.expect("read record");
let w = writer.get_or_insert_with(|| {
let file = File::create(out_path).expect("create output");
StdfWriter::new(BufWriter::new(file), view.byte_order)
});
if view.header.typ == PTR_TYP && view.header.sub == PTR_SUB {
dropped += 1;
continue;
}
w.write_raw_view(&view).expect("write record");
kept += 1;
}
if let Some(mut w) = writer {
w.flush().expect("flush");
}
println!("{out_path}: kept {kept} record(s), dropped {dropped} PTR(s)");
}