use vsf::builders::*;
use vsf::types::BitPackedTensor;
fn main() -> Result<(), String> {
println!("=== VSF RAW Image Example ===\n");
let width = 17;
let height = 163;
let planes = 1;
let bits = 11;
let cfa = vec![b'R', b'G', b'C', b'Y']; let blackpoint = 499;
let whitepoint = 8047;
println!("Sensor specs:");
println!(" Resolution: {}×{} (single plane)", width, height);
println!(" Bit depth: {} bits per sample", bits);
println!(" CFA pattern: RGCY (Red, Green, Cyan, Yellow)");
println!(" Black level: {}", blackpoint);
println!(" White level: {}\n", whitepoint);
let total_samples = width * height * planes;
let mut samples = Vec::with_capacity(total_samples);
let mut rng = 0usize;
for sample in 0..total_samples {
rng ^= rng.rotate_left(13).wrapping_add(sample);
let value = rng as u8 as u16 + blackpoint; samples.push(value);
}
let image = BitPackedTensor::pack(bits, vec![width, height], &samples);
println!(
"Packed {} samples into {} bytes\n",
total_samples,
image.data.len()
);
println!("Building VSF RAW image with metadata...");
let mut raw = RawImageBuilder::new(image);
raw.raw.cfa_pattern = Some(cfa);
raw.raw.black_level = Some(blackpoint as f32);
raw.raw.white_level = Some(whitepoint as f32);
raw.raw.magic_9 = Some(vec![
1.5, -0.3, -0.2, -0.4, 1.6, -0.2, -0.1, -0.5, 1.6,
]);
raw.camera.make = Some("Sony".to_string());
raw.camera.model = Some("α7 IV".to_string());
raw.camera.serial_number = Some("87654321".to_string());
raw.camera.iso_speed = Some(800.);
raw.camera.shutter_time_s = Some(1. / 60.); raw.camera.aperture_f_number = Some(2.8);
raw.camera.focal_length_m = Some(0.024); raw.camera.exposure_compensation = Some(0.);
raw.camera.focus_distance_m = Some(5.);
raw.camera.flash_fired = Some(false);
raw.camera.metering_mode = Some("matrix".to_string());
raw.lens.make = Some("Sony".to_string());
raw.lens.model = Some("FE 24mm F2.8 G".to_string());
raw.lens.serial_number = Some("12345678".to_string());
raw.lens.min_focal_length_m = Some(0.024); raw.lens.max_focal_length_m = Some(0.024);
raw.lens.min_aperture_f = Some(2.8);
raw.lens.max_aperture_f = Some(22.);
let raw_bytes = raw.build()?;
println!("✓ Built VSF RAW image: {} bytes", raw_bytes.len());
println!(" (Includes mandatory BLAKE3 hash for integrity)\n");
std::fs::write("example_raw.vsf", &raw_bytes).expect("Failed to write file");
println!("✓ Saved to example_raw.vsf");
println!("\n=== Complete! ===");
println!("The RAW image includes:");
println!(" • Bitpacked sensor data ({}-bit samples)", bits);
println!(" • CFA pattern (RGCY Bayer)");
println!(" • Black/white levels");
println!(" • Colour transformation matrix (Magic 9)");
println!(" • Camera information (make, model, S/N, ISO, shutter, aperture, etc.)");
println!(" • Lens information (make, model, S/N, focal length range, etc.)");
println!(" • Mandatory BLAKE3 file hash (automatic)");
println!("\nAll metadata is validated and type-checked at compile time.");
println!("Try changing a value to something invalid - the compiler will catch it!");
Ok(())
}