pub fn parse_binary(input: &[u8]) -> Result<Vdf<'_>>Expand description
Parse VDF from binary format (autodetects shortcuts or appinfo format).
This function returns zero-copy data where possible - strings are borrowed
from the input buffer. Use .into_owned() to convert to an owned Vdf<'static>.
Examples found in repository?
examples/test_parse_real.rs (line 28)
4fn main() {
5 // Test localconfig.vdf (text format)
6 println!("=== Parsing localconfig.vdf (text format) ===");
7 let localconfig = fs::read_to_string(
8 "/home/mexus/.local/share/Steam/userdata/127648749/config/localconfig.vdf",
9 );
10 match localconfig {
11 Ok(content) => match parse_text(&content) {
12 Ok(vdf) => {
13 println!("Success!");
14 println!("Root key: {}", vdf.key());
15 let obj = vdf.as_obj().unwrap();
16 println!("Root has {} keys", obj.len());
17 }
18 Err(e) => {
19 println!("Parse error: {:?}", e);
20 }
21 },
22 Err(e) => println!("Error reading: {}", e),
23 }
24
25 println!("\n=== Parsing appinfo.vdf (binary format) ===");
26 let appinfo = fs::read("/home/mexus/.local/share/Steam/appcache/appinfo.vdf");
27 match appinfo {
28 Ok(data) => match parse_binary(&data) {
29 Ok(vdf) => {
30 println!("Success!");
31 println!("Root key: {}", vdf.key());
32 let obj = vdf.as_obj().unwrap();
33 println!("Root has {} keys", obj.len());
34 }
35 Err(e) => {
36 println!("Parse error: {:?}", e);
37 }
38 },
39 Err(e) => println!("Error reading: {}", e),
40 }
41}More examples
examples/dump_vdf.rs (line 76)
44fn main() {
45 let args: Vec<String> = env::args().collect();
46 if args.len() < 2 {
47 eprintln!("Usage: {} <vdf_file> [--text]", args[0]);
48 eprintln!(
49 " --text: force text format parsing (default: auto-detect based on file extension)"
50 );
51 std::process::exit(1);
52 }
53
54 let path = Path::new(&args[1]);
55 let force_text = args.len() > 2 && args[2] == "--text";
56
57 let result = if force_text || path.extension().is_some_and(|e| e == "vdf") {
58 // Try text first for .vdf files
59 let content = std::fs::read_to_string(path);
60 if let Ok(content) = content {
61 parse_text(&content).map(|v| v.into_owned())
62 } else {
63 // Fall back to binary
64 let data = std::fs::read(path).expect("Failed to read file");
65 if path
66 .file_name()
67 .is_some_and(|n| n.to_str().is_some_and(|s| s.contains("packageinfo")))
68 {
69 binary::parse_packageinfo(&data).map(|v| v.into_owned())
70 } else if path
71 .file_name()
72 .is_some_and(|n| n.to_str().is_some_and(|s| s.contains("appinfo")))
73 {
74 binary::parse_appinfo(&data).map(|v| v.into_owned())
75 } else {
76 parse_binary(&data).map(|v| v.into_owned())
77 }
78 }
79 } else {
80 // Binary parsing
81 let data = std::fs::read(path).expect("Failed to read file");
82 if path
83 .file_name()
84 .is_some_and(|n| n.to_str().is_some_and(|s| s.contains("packageinfo")))
85 {
86 binary::parse_packageinfo(&data).map(|v| v.into_owned())
87 } else if path
88 .file_name()
89 .is_some_and(|n| n.to_str().is_some_and(|s| s.contains("appinfo")))
90 {
91 binary::parse_appinfo(&data).map(|v| v.into_owned())
92 } else {
93 parse_binary(&data).map(|v| v.into_owned())
94 }
95 };
96
97 match result {
98 Ok(vdf) => {
99 println!("\"{}\" {}", vdf.key(), dump_value(vdf.value(), 0));
100 }
101 Err(e) => {
102 eprintln!("Error parsing VDF: {:?}", e);
103 std::process::exit(1);
104 }
105 }
106}