1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//! Builder for [`Tree`] and [`TreeEntry`] objects.
//!
//! This module provides two builders:
//! - [`TreeBuilder`] for constructing a full [`Tree`] object.
//! - [`TreeEntryBuilder`] for constructing a single [`TreeEntry`].
//!
//! # Building a tree
//!
//! A tree is built by adding entries one by one. Entries can be added as
//! pre‑built [`TreeEntry`] values, or from parts using the convenience
//! method [`add_entry`](TreeBuilder::add_entry).
//!
//! The [`build`](TreeBuilder::build) method delegates to [`Tree::new`],
//! which enforces that entries are sorted lexicographically by name and
//! have no duplicates. If entries are not in the correct order, the build
//! will fail with an error.
//!
//! # Example
//!
//! ```rust
//! use libvctrl_core::object::{TreeBuilder, TreeEntryBuilder};
//! use libvctrl_handler::*;
//!
//! let hash = Hash::from_bytes(&[0xAA; 64]).unwrap();
//!
//! // Build a tree with two entries
//! let tree = TreeBuilder::new()
//! .add_entry("a.txt".into(), EntryKind::Blob, hash).unwrap()
//! .add_entry("b.txt".into(), EntryKind::Blob, hash).unwrap()
//! .build()
//! .unwrap();
//!
//! // Build a single entry
//! let entry = TreeEntryBuilder::new("file".into(), EntryKind::Blob, hash)
//! .build()
//! .unwrap();
//! ```
//!
//! # Sorting requirement
//!
//! The entries **must** be added in sorted order. If you add entries out
//! of order and then call `build()`, you will get an error. This is
//! intentional – it prevents accidental creation of invalid trees.
use ;
/// Builder for [`Tree`] objects.
///
/// Entries are collected and then validated upon [`build`](TreeBuilder::build).
///
/// # Example
///
/// ```rust
/// # use libvctrl_core::object::TreeBuilder;
/// # use libvctrl_handler::*;
/// let hash = Hash::from_bytes(&[0u8; 64]).unwrap();
/// let tree = TreeBuilder::new()
/// .add_entry("README.md".into(), EntryKind::Blob, hash)
/// .unwrap()
/// .build()
/// .unwrap();
/// ```
/// Builder for a single [`TreeEntry`].
///
/// # Example
///
/// ```rust
/// # use libvctrl_core::object::TreeEntryBuilder;
/// # use libvctrl_handler::*;
/// let hash = Hash::from_bytes(&[0u8; 64]).unwrap();
/// let entry = TreeEntryBuilder::new("file.txt".into(), EntryKind::Blob, hash)
/// .build()
/// .unwrap();
/// ```