Skip to main content

debug_vsf_bytes/
debug_vsf_bytes.rs

1use chrono::Utc;
2use vsf::types::{EtType, VsfType};
3
4fn main() {
5    // Simulate what vsf_builder does
6    let mut vsf: Vec<Vec<u8>> = Vec::new();
7
8    // Magic + header start
9    vsf.push("RÅ".as_bytes().to_vec());
10    vsf[0].push(b'<');
11
12    // Header length placeholder
13    vsf.push(VsfType::b(0, true).flatten());
14
15    // Version and backward compat (in same vec)
16    let header_index = vsf.len();
17    vsf.push(VsfType::z(2).flatten());
18    vsf[header_index].extend_from_slice(&VsfType::y(2).flatten());
19
20    // Creation time (e6 — 64-bit oscillation count)
21    let now = Utc::now();
22    let et = vsf::datetime_to_eagle_time(now);
23    let oscillations = et.oscillations().unwrap_or(0);
24    let creation_time = VsfType::e(EtType::e6(oscillations));
25    vsf[header_index].extend_from_slice(&creation_time.flatten());
26
27    // Hash placeholder
28    vsf[header_index].extend_from_slice(&VsfType::hb(vec![0u8; 32]).flatten());
29
30    // Flatten
31    let bytes: Vec<u8> = vsf.into_iter().flatten().collect();
32
33    println!("Total bytes: {}", bytes.len());
34    println!("\nFirst 60 bytes with positions:");
35    for (i, &b) in bytes.iter().take(60).enumerate() {
36        if i % 16 == 0 {
37            println!();
38            print!("{:04X}: ", i);
39        }
40        print!("{:02X} ", b);
41    }
42    println!("\n");
43
44    // Find where 'h' appears
45    for (i, &b) in bytes.iter().enumerate().take(40) {
46        if b == b'h' {
47            println!("Found 'h' at position {}", i);
48        }
49    }
50
51    // Parse like verification does
52    println!("\nParsing simulation:");
53    let mut pointer = 0;
54
55    // Skip magic
56    pointer += 3; // "RÅ"
57    pointer += 1; // '<'
58    println!("After magic: pointer = {}", pointer);
59
60    // Parse header length
61    let hl_start = pointer;
62    if bytes[pointer] == b'b' {
63        pointer += 1;
64        let len_marker = bytes[pointer];
65        pointer += 1;
66        println!(
67            "Header length type at {}, marker={}, pointer now={}",
68            hl_start, len_marker as char, pointer
69        );
70    }
71
72    // Parse version (z)
73    let v_start = pointer;
74    if bytes[pointer] == b'z' {
75        pointer += 1;
76        let len_marker = bytes[pointer];
77        pointer += 1;
78        println!(
79            "Version at {}, marker={}, pointer now={}",
80            v_start, len_marker as char, pointer
81        );
82    }
83
84    // Parse backward compat (y)
85    let bc_start = pointer;
86    if bytes[pointer] == b'y' {
87        pointer += 1;
88        let len_marker = bytes[pointer];
89        pointer += 1;
90        println!(
91            "Backward compat at {}, marker={}, pointer now={}",
92            bc_start, len_marker as char, pointer
93        );
94    }
95
96    // Parse creation time (e)
97    let et_start = pointer;
98    if bytes[pointer] == b'e' {
99        pointer += 1;
100        if bytes[pointer] == b'f' {
101            pointer += 1;
102            if bytes[pointer] == b'5' {
103                pointer += 1;
104                pointer += 4; // f32
105                println!("Eagle Time (ef5) at {}, pointer now={}", et_start, pointer);
106            }
107        }
108    }
109
110    // Now we should be at the hash
111    println!(
112        "\nAt position {}: byte = 0x{:02X} ('{}')",
113        pointer, bytes[pointer], bytes[pointer] as char
114    );
115    if bytes[pointer] == b'h' {
116        println!("SUCCESS: Found hash placeholder at correct position!");
117    } else {
118        println!("ERROR: Expected 'h', found something else");
119    }
120}