use babbel_bencode::nodes::node::Node;
use babbel_bencode::make_node;
use std::collections::HashMap;
fn main() {
let mut root = HashMap::new();
root.insert("announce".to_string(), make_node("udp://tracker.example.com:80"));
root.insert("created by".to_string(), make_node("AI Assistant Example Generator"));
root.insert("creation date".to_string(), make_node(1_725_000_000));
let announce_list = make_node(vec![
make_node(vec![
make_node("udp://tracker.example.com:80"),
make_node("http://tracker.example.com/announce"),
]),
make_node(vec![
make_node("udp://backup-tracker.example.org:1337"),
]),
]);
root.insert("announce-list".to_string(), announce_list);
root.insert("info".to_string(), build_info_dict());
root.insert(
"url-list".to_string(),
make_node(vec![
make_node("https://mirror1.example.org/file"),
make_node("https://mirror2.example.org/file"),
]),
);
root.insert("comment".to_string(), make_node("Multi-file torrent with complex structure"));
let tree = Node::Dictionary(root);
println!("{:#?}", tree);
}
fn build_info_dict() -> Node {
let mut info = HashMap::new();
info.insert("name".to_string(), make_node("example-project"));
info.insert("piece length".to_string(), make_node(256 * 1024));
info.insert(
"pieces".to_string(),
make_node("abcdef012345...abcdef012345"),
);
info.insert("private".to_string(), make_node(1));
info.insert("files".to_string(), build_files_list());
info.insert("meta".to_string(), build_meta_dict());
Node::Dictionary(info)
}
fn build_files_list() -> Node {
let file1 = {
let mut f = HashMap::new();
f.insert("length".to_string(), make_node(1_048_576)); f.insert(
"path".to_string(),
make_node(vec![
make_node("src"),
make_node("main.rs"),
]),
);
f.insert(
"md5sum".to_string(),
make_node("d41d8cd98f00b204e9800998ecf8427e"),
);
Node::Dictionary(f)
};
let file2 = {
let mut f = HashMap::new();
f.insert("length".to_string(), make_node(2_621_440)); f.insert(
"path".to_string(),
make_node(vec![
make_node("assets"),
make_node("images"),
make_node("logo.png"),
]),
);
f.insert(
"attr".to_string(),
Node::Dictionary({
let mut attr = HashMap::new();
attr.insert("read_only".to_string(), make_node(0));
attr.insert("lang".to_string(), make_node("en-US"));
attr
}),
);
Node::Dictionary(f)
};
let file3 = {
let mut f = HashMap::new();
f.insert("length".to_string(), make_node(512_000)); f.insert(
"path".to_string(),
make_node(vec![
make_node("docs"),
make_node("guide.md"),
]),
);
Node::Dictionary(f)
};
make_node(vec![file1, file2, file3])
}
fn build_meta_dict() -> Node {
let authors = make_node(vec![
Node::Dictionary({
let mut a = HashMap::new();
a.insert("name".to_string(), make_node("Alice"));
a.insert("email".to_string(), make_node("alice@example.com"));
a
}),
Node::Dictionary({
let mut a = HashMap::new();
a.insert("name".to_string(), make_node("Bob"));
a.insert("email".to_string(), make_node("bob@example.com"));
a
}),
]);
let tags = make_node(vec![
make_node("rust"),
make_node("bencode"),
make_node("example"),
]);
let build = Node::Dictionary({
let mut b = HashMap::new();
b.insert(
"targets".to_string(),
make_node(vec![
make_node("x86_64-unknown-linux-gnu"),
make_node("aarch64-apple-darwin"),
]),
);
b.insert(
"features".to_string(),
make_node(vec![
make_node("serde"),
make_node("cli"),
]),
);
b
});
Node::Dictionary({
let mut meta = HashMap::new();
meta.insert("version".to_string(), make_node("1.2.3"));
meta.insert("authors".to_string(), authors);
meta.insert("tags".to_string(), tags);
meta.insert("build".to_string(), build);
meta
})
}