use vb6parse::io::{Comparator, SourceStream};
const VB6_CODE: &str = r#"Private Sub Form_Load()
Dim x As Integer
Dim message As String
x = 42
message = "Hello, World!"
MsgBox message
End Sub
' This is a comment
Public Function Calculate(a As Integer, b As Integer) As Integer
Calculate = a + b
End Function"#;
fn main() {
let mut stream = SourceStream::new("example.bas", VB6_CODE);
println!("=== SourceStream Example ===");
println!("File: {}", stream.file_name());
println!("================================");
println!();
println!("{VB6_CODE}");
println!();
println!("================================");
println!();
println!("Content length: {} characters", stream.contents.len());
println!("Initial offset: {}\n", stream.offset());
println!();
println!("=== Parsing Tokens Example ===");
let mut tokens = Vec::new();
while !stream.is_empty() {
if stream.take_ascii_whitespaces().is_some() {
continue;
}
if let Some(identifier) = stream.take_ascii_underscore_alphanumerics() {
tokens.push(("Identifier", identifier));
}
else if let Some(punctuation) = stream.take_ascii_punctuation() {
tokens.push(("Punctuation", punctuation));
}
else if stream.peek_text("\"", Comparator::CaseSensitive).is_some() {
stream.forward(1); if let Some((string_content, _)) = stream.take_until("\"", Comparator::CaseSensitive) {
stream.forward(1); tokens.push(("String", string_content));
}
}
else if let Some(digits) = stream.take_ascii_digits() {
tokens.push(("Number", digits));
}
else if stream.take_newline().is_some() {
tokens.push(("Newline", "\\n"));
}
else {
stream.forward(1);
}
if tokens.len() >= 20 {
break;
}
}
println!("First 20 tokens:");
for (i, (token_type, value)) in tokens.iter().enumerate() {
println!(" {:2}: {:12} = '{}'", i + 1, token_type, value);
}
}