parse

Function parse 

Source
pub fn parse(input: &str) -> Result<Vdf<'_>>
Expand description

Parse a VDF document from text format.

ยงExample

use steam_vdf_parser::parse_text;

let input = r#""root"
{
    "key" "value"
}"#;
let vdf = parse_text(input).unwrap();
assert_eq!(vdf.key(), "root");
Examples found in repository?
examples/test_parse_real.rs (line 11)
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
Hide additional examples
examples/print.rs (line 28)
12fn main() {
13    let args: Vec<String> = env::args().collect();
14    if args.len() < 2 {
15        eprintln!("Usage: {} <vdf_file>", args[0]);
16        eprintln!();
17        eprintln!("Pretty-prints a VDF file to stdout in valid VDF text format.");
18        eprintln!("Supports both text (.vdf) and binary (appinfo.vdf, packageinfo.vdf, shortcuts.vdf) formats.");
19        std::process::exit(1);
20    }
21
22    let path = Path::new(&args[1]);
23    let data = std::fs::read(path).expect("Failed to read file");
24
25    // Try to detect format and parse accordingly
26    let result = if let Ok(text) = std::str::from_utf8(&data) {
27        // Looks like text, try text parser first
28        parse_text(text)
29            .map(|v| v.into_owned())
30            .or_else(|_| parse_binary(&data).map(|v| v.into_owned()))
31    } else {
32        // Binary data - detect format from filename
33        let filename = path
34            .file_name()
35            .and_then(|n| n.to_str())
36            .unwrap_or_default();
37
38        if filename.contains("packageinfo") {
39            binary::parse_packageinfo(&data).map(|v| v.into_owned())
40        } else if filename.contains("appinfo") {
41            binary::parse_appinfo(&data).map(|v| v.into_owned())
42        } else {
43            parse_binary(&data).map(|v| v.into_owned())
44        }
45    };
46
47    match result {
48        Ok(vdf) => {
49            // Use the pretty-print Display implementation
50            println!("{:#}", vdf);
51        }
52        Err(e) => {
53            eprintln!("Error parsing VDF: {:?}", e);
54            std::process::exit(1);
55        }
56    }
57}
examples/dump_vdf.rs (line 61)
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}