pub struct Db { /* private fields */ }Implementations§
Source§impl Db
impl Db
Sourcepub fn new() -> Self
pub fn new() -> Self
Allocate an empty database. Use Db::append_rset to add record sets
before serializing via Db::to_rec_string.
Examples found in repository?
examples/write_rec.rs (line 10)
9fn main() -> Result<(), Box<dyn std::error::Error>> {
10 let mut db = Db::new();
11
12 let mut rset = OwnedRset::new();
13
14 let mut descriptor = Record::new();
15 descriptor.append_field("%rec", "Book")?;
16 descriptor.append_field("%type", "Year int")?;
17 descriptor.append_field("%mandatory", "Title")?;
18 rset.set_descriptor(descriptor);
19
20 for (title, author, year) in [
21 ("Refactoring", "Martin Fowler", "1999"),
22 ("Domain-Driven Design", "Eric Evans", "2003"),
23 ("Test-Driven Development", "Kent Beck", "2002"),
24 ] {
25 let mut record = Record::new();
26 record.append_field("Title", title)?;
27 record.append_field("Author", author)?;
28 record.append_field("Year", year)?;
29 rset.append_record(record)?;
30 }
31
32 db.append_rset(rset)?;
33 println!("{}", db.to_rec_string()?);
34 Ok(())
35}Sourcepub fn parse_str(text: &str) -> Result<Self, Error>
pub fn parse_str(text: &str) -> Result<Self, Error>
Examples found in repository?
More examples
examples/query_records.rs (line 14)
5fn main() {
6 let mut args = std::env::args().skip(1);
7 let path = args
8 .next()
9 .expect("usage: query_records <file.rec> <Type> <selection-expression>");
10 let rset_type = args.next().expect("missing record type");
11 let expr = args.next().expect("missing selection expression");
12
13 let text = fs::read_to_string(&path).expect("read file");
14 let mut db = Db::parse_str(&text).expect("parse");
15
16 let rset = db
17 .rset_by_type(&rset_type)
18 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
19 let selection_expression =
20 SelectionExpression::compile(&expr, false).expect("compile selection expression");
21
22 let mut matches = 0usize;
23 for record in rset.records().filter(|r| selection_expression.matches(r)) {
24 matches += 1;
25 for field in record.fields() {
26 println!("{}: {}", field.name(), field.value());
27 }
28 println!();
29 }
30 eprintln!("{matches} match(es)");
31}examples/append_record.rs (line 20)
5fn main() {
6 let mut args = std::env::args().skip(1);
7 let path = args
8 .next()
9 .expect("usage: append_record <file.rec> <Type> Field=Value [Field=Value ...]");
10 let rset_type = args.next().expect("missing record type");
11 let pairs: Vec<(String, String)> = args
12 .map(|a| {
13 let (k, v) = a.split_once('=').expect("expected Field=Value");
14 (k.to_string(), v.to_string())
15 })
16 .collect();
17 assert!(!pairs.is_empty(), "need at least one Field=Value");
18
19 let text = fs::read_to_string(&path).expect("read file");
20 let mut db = Db::parse_str(&text).expect("parse");
21
22 let mut record = Record::new();
23 for (k, v) in &pairs {
24 record.append_field(k, v).expect("append field");
25 }
26
27 {
28 let mut rset = db
29 .rset_by_type(&rset_type)
30 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
31 rset.append_record(record).expect("append record");
32 }
33
34 let serialized = db.to_rec_string().expect("serialize");
35 fs::write(&path, serialized).expect("write file");
36 println!("appended 1 record to rset {rset_type:?} in {path}");
37}examples/modify_records.rs (line 23)
15fn main() -> ExitCode {
16 let mut args = std::env::args().skip(1);
17 let path = args.next().unwrap_or_else(|| usage());
18 let rset_type = args.next().unwrap_or_else(|| usage());
19 let expr = args.next().unwrap_or_else(|| usage());
20 let action = args.next().unwrap_or_else(|| usage());
21
22 let text = fs::read_to_string(&path).expect("read file");
23 let mut db = Db::parse_str(&text).expect("parse");
24 let selection_expression =
25 SelectionExpression::compile(&expr, false).expect("compile selection expression");
26
27 let summary = {
28 let mut rset = db
29 .rset_by_type(&rset_type)
30 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
31
32 match action.as_str() {
33 "set" => {
34 let pair = args.next().unwrap_or_else(|| usage());
35 let (field, value) = pair
36 .split_once('=')
37 .unwrap_or_else(|| panic!("expected Field=Value, got {pair:?}"));
38 let mut updated = 0usize;
39 let mut missing = 0usize;
40 for mut record in rset.records().filter(|r| selection_expression.matches(r)) {
41 match record.set_field(field, value).expect("set field") {
42 true => updated += 1,
43 false => missing += 1,
44 }
45 }
46 format!(
47 "set {field}={value} on {updated} record(s); {missing} matching record(s) had no such field"
48 )
49 }
50 "delete" => {
51 let removed = rset.remove_matching(|r| selection_expression.matches(r));
52 format!("deleted {removed} record(s)")
53 }
54 other => {
55 eprintln!("unknown action {other:?}");
56 return ExitCode::from(2);
57 }
58 }
59 };
60
61 let serialized = db.to_rec_string().expect("serialize");
62 fs::write(&path, serialized).expect("write file");
63 println!("{summary}");
64 ExitCode::SUCCESS
65}Sourcepub fn rset_by_type(&mut self, name: &str) -> Option<Rset<'_>>
pub fn rset_by_type(&mut self, name: &str) -> Option<Rset<'_>>
Examples found in repository?
examples/query_records.rs (line 17)
5fn main() {
6 let mut args = std::env::args().skip(1);
7 let path = args
8 .next()
9 .expect("usage: query_records <file.rec> <Type> <selection-expression>");
10 let rset_type = args.next().expect("missing record type");
11 let expr = args.next().expect("missing selection expression");
12
13 let text = fs::read_to_string(&path).expect("read file");
14 let mut db = Db::parse_str(&text).expect("parse");
15
16 let rset = db
17 .rset_by_type(&rset_type)
18 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
19 let selection_expression =
20 SelectionExpression::compile(&expr, false).expect("compile selection expression");
21
22 let mut matches = 0usize;
23 for record in rset.records().filter(|r| selection_expression.matches(r)) {
24 matches += 1;
25 for field in record.fields() {
26 println!("{}: {}", field.name(), field.value());
27 }
28 println!();
29 }
30 eprintln!("{matches} match(es)");
31}More examples
examples/append_record.rs (line 29)
5fn main() {
6 let mut args = std::env::args().skip(1);
7 let path = args
8 .next()
9 .expect("usage: append_record <file.rec> <Type> Field=Value [Field=Value ...]");
10 let rset_type = args.next().expect("missing record type");
11 let pairs: Vec<(String, String)> = args
12 .map(|a| {
13 let (k, v) = a.split_once('=').expect("expected Field=Value");
14 (k.to_string(), v.to_string())
15 })
16 .collect();
17 assert!(!pairs.is_empty(), "need at least one Field=Value");
18
19 let text = fs::read_to_string(&path).expect("read file");
20 let mut db = Db::parse_str(&text).expect("parse");
21
22 let mut record = Record::new();
23 for (k, v) in &pairs {
24 record.append_field(k, v).expect("append field");
25 }
26
27 {
28 let mut rset = db
29 .rset_by_type(&rset_type)
30 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
31 rset.append_record(record).expect("append record");
32 }
33
34 let serialized = db.to_rec_string().expect("serialize");
35 fs::write(&path, serialized).expect("write file");
36 println!("appended 1 record to rset {rset_type:?} in {path}");
37}examples/modify_records.rs (line 29)
15fn main() -> ExitCode {
16 let mut args = std::env::args().skip(1);
17 let path = args.next().unwrap_or_else(|| usage());
18 let rset_type = args.next().unwrap_or_else(|| usage());
19 let expr = args.next().unwrap_or_else(|| usage());
20 let action = args.next().unwrap_or_else(|| usage());
21
22 let text = fs::read_to_string(&path).expect("read file");
23 let mut db = Db::parse_str(&text).expect("parse");
24 let selection_expression =
25 SelectionExpression::compile(&expr, false).expect("compile selection expression");
26
27 let summary = {
28 let mut rset = db
29 .rset_by_type(&rset_type)
30 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
31
32 match action.as_str() {
33 "set" => {
34 let pair = args.next().unwrap_or_else(|| usage());
35 let (field, value) = pair
36 .split_once('=')
37 .unwrap_or_else(|| panic!("expected Field=Value, got {pair:?}"));
38 let mut updated = 0usize;
39 let mut missing = 0usize;
40 for mut record in rset.records().filter(|r| selection_expression.matches(r)) {
41 match record.set_field(field, value).expect("set field") {
42 true => updated += 1,
43 false => missing += 1,
44 }
45 }
46 format!(
47 "set {field}={value} on {updated} record(s); {missing} matching record(s) had no such field"
48 )
49 }
50 "delete" => {
51 let removed = rset.remove_matching(|r| selection_expression.matches(r));
52 format!("deleted {removed} record(s)")
53 }
54 other => {
55 eprintln!("unknown action {other:?}");
56 return ExitCode::from(2);
57 }
58 }
59 };
60
61 let serialized = db.to_rec_string().expect("serialize");
62 fs::write(&path, serialized).expect("write file");
63 println!("{summary}");
64 ExitCode::SUCCESS
65}Sourcepub fn append_rset(&mut self, rset: OwnedRset) -> Result<(), Error>
pub fn append_rset(&mut self, rset: OwnedRset) -> Result<(), Error>
Append an OwnedRset to the end of the database. Ownership of the
rset transfers to librec; the rset will be freed when this Db is
dropped.
Examples found in repository?
examples/write_rec.rs (line 32)
9fn main() -> Result<(), Box<dyn std::error::Error>> {
10 let mut db = Db::new();
11
12 let mut rset = OwnedRset::new();
13
14 let mut descriptor = Record::new();
15 descriptor.append_field("%rec", "Book")?;
16 descriptor.append_field("%type", "Year int")?;
17 descriptor.append_field("%mandatory", "Title")?;
18 rset.set_descriptor(descriptor);
19
20 for (title, author, year) in [
21 ("Refactoring", "Martin Fowler", "1999"),
22 ("Domain-Driven Design", "Eric Evans", "2003"),
23 ("Test-Driven Development", "Kent Beck", "2002"),
24 ] {
25 let mut record = Record::new();
26 record.append_field("Title", title)?;
27 record.append_field("Author", author)?;
28 record.append_field("Year", year)?;
29 rset.append_record(record)?;
30 }
31
32 db.append_rset(rset)?;
33 println!("{}", db.to_rec_string()?);
34 Ok(())
35}Sourcepub fn to_rec_string(&self) -> Result<String, Error>
pub fn to_rec_string(&self) -> Result<String, Error>
Examples found in repository?
examples/write_rec.rs (line 33)
9fn main() -> Result<(), Box<dyn std::error::Error>> {
10 let mut db = Db::new();
11
12 let mut rset = OwnedRset::new();
13
14 let mut descriptor = Record::new();
15 descriptor.append_field("%rec", "Book")?;
16 descriptor.append_field("%type", "Year int")?;
17 descriptor.append_field("%mandatory", "Title")?;
18 rset.set_descriptor(descriptor);
19
20 for (title, author, year) in [
21 ("Refactoring", "Martin Fowler", "1999"),
22 ("Domain-Driven Design", "Eric Evans", "2003"),
23 ("Test-Driven Development", "Kent Beck", "2002"),
24 ] {
25 let mut record = Record::new();
26 record.append_field("Title", title)?;
27 record.append_field("Author", author)?;
28 record.append_field("Year", year)?;
29 rset.append_record(record)?;
30 }
31
32 db.append_rset(rset)?;
33 println!("{}", db.to_rec_string()?);
34 Ok(())
35}More examples
examples/append_record.rs (line 34)
5fn main() {
6 let mut args = std::env::args().skip(1);
7 let path = args
8 .next()
9 .expect("usage: append_record <file.rec> <Type> Field=Value [Field=Value ...]");
10 let rset_type = args.next().expect("missing record type");
11 let pairs: Vec<(String, String)> = args
12 .map(|a| {
13 let (k, v) = a.split_once('=').expect("expected Field=Value");
14 (k.to_string(), v.to_string())
15 })
16 .collect();
17 assert!(!pairs.is_empty(), "need at least one Field=Value");
18
19 let text = fs::read_to_string(&path).expect("read file");
20 let mut db = Db::parse_str(&text).expect("parse");
21
22 let mut record = Record::new();
23 for (k, v) in &pairs {
24 record.append_field(k, v).expect("append field");
25 }
26
27 {
28 let mut rset = db
29 .rset_by_type(&rset_type)
30 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
31 rset.append_record(record).expect("append record");
32 }
33
34 let serialized = db.to_rec_string().expect("serialize");
35 fs::write(&path, serialized).expect("write file");
36 println!("appended 1 record to rset {rset_type:?} in {path}");
37}examples/modify_records.rs (line 61)
15fn main() -> ExitCode {
16 let mut args = std::env::args().skip(1);
17 let path = args.next().unwrap_or_else(|| usage());
18 let rset_type = args.next().unwrap_or_else(|| usage());
19 let expr = args.next().unwrap_or_else(|| usage());
20 let action = args.next().unwrap_or_else(|| usage());
21
22 let text = fs::read_to_string(&path).expect("read file");
23 let mut db = Db::parse_str(&text).expect("parse");
24 let selection_expression =
25 SelectionExpression::compile(&expr, false).expect("compile selection expression");
26
27 let summary = {
28 let mut rset = db
29 .rset_by_type(&rset_type)
30 .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
31
32 match action.as_str() {
33 "set" => {
34 let pair = args.next().unwrap_or_else(|| usage());
35 let (field, value) = pair
36 .split_once('=')
37 .unwrap_or_else(|| panic!("expected Field=Value, got {pair:?}"));
38 let mut updated = 0usize;
39 let mut missing = 0usize;
40 for mut record in rset.records().filter(|r| selection_expression.matches(r)) {
41 match record.set_field(field, value).expect("set field") {
42 true => updated += 1,
43 false => missing += 1,
44 }
45 }
46 format!(
47 "set {field}={value} on {updated} record(s); {missing} matching record(s) had no such field"
48 )
49 }
50 "delete" => {
51 let removed = rset.remove_matching(|r| selection_expression.matches(r));
52 format!("deleted {removed} record(s)")
53 }
54 other => {
55 eprintln!("unknown action {other:?}");
56 return ExitCode::from(2);
57 }
58 }
59 };
60
61 let serialized = db.to_rec_string().expect("serialize");
62 fs::write(&path, serialized).expect("write file");
63 println!("{summary}");
64 ExitCode::SUCCESS
65}Trait Implementations§
Auto Trait Implementations§
impl Freeze for Db
impl RefUnwindSafe for Db
impl !Send for Db
impl !Sync for Db
impl Unpin for Db
impl UnsafeUnpin for Db
impl UnwindSafe for Db
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more