Struct bill::Bill

source ยท
pub struct Bill<P> {
    pub items_by_tax: BTreeMap<Tax, ItemList<P>>,
}
Expand description

This is where the magic happens.

Fieldsยง

ยงitems_by_tax: BTreeMap<Tax, ItemList<P>>

Implementationsยง

sourceยง

impl<P: BillProduct> Bill<P>

source

pub fn new() -> Self

Instantiates a new Bill

Examples found in repository?
examples/catalogue.rs (line 49)
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
fn main() {
    let coffee = Product::new("Coffee", c(250), 0.19);
    let tee = Product::new("Tea", c(175), 0.19);
    let water = Product::new("Water", c(61), 0.19);
    let applejuice = Product::new("AppleJuice", c(164), 0.19);
    let orangejuice = Product::new("OrangeJuice", c(186), 0.19);
    let bagel = Product::new("Bagel", c(219), 0.19);
    let sandwich = Product::new("Sandwich", c(340), 0.19);
    let pie = Product::new("pie", c(94), 0.19);
    let soup = Product::new("Soup", c(310), 0.19);
    let service = Product::new("Service", c(800), 0.00);

    let mut offer = Bill::new();
    offer.add_item(8., water);
    offer.add_item(4., applejuice);
    offer.add_item(4., orangejuice);
    offer.add_item(40., sandwich);
    offer.add_item(2., service);

    let mut invoice = Bill::new();
    invoice.add_item(2., water);
    invoice.add_item(0., applejuice);
    invoice.add_item(2., orangejuice);
    invoice.add_item(50., sandwich);
    invoice.add_item(2.5, service);

    let mut invoice2 = Bill::new();
    invoice2.add_item(99.0, Product::new("Red Ballons", c(99), 0.19));

    #[cfg(not(feature = "serialization"))]
    {
        print("offer", &offer);
        print("invoice", &invoice);
        print("invoice2", &invoice2);
    }
    #[cfg(feature = "serialization")]
    {
        println!("{}", serde_json::to_string_pretty(&offer).unwrap());
        println!("{}", serde_json::to_string_pretty(&invoice).unwrap());
        println!("{}", serde_json::to_string_pretty(&invoice2).unwrap());
    }
}
source

pub fn to_items_with_tax(&self) -> BTreeMap<Tax, &BillItem<P>>

source

pub fn as_items_with_tax(&self) -> Vec<(Tax, &BillItem<P>)>

Returns a Vec of Tax and BillItem

source

pub fn as_items(&self) -> Vec<&BillItem<P>>

Returns a Vec of BillItem

source

pub fn add(&mut self, item: BillItem<P>)

Adds a new BillItem to the list.

source

pub fn add_item(&mut self, amount: Amount, product: P)

Instantiates and adds a new BillItem to the list.

Examples found in repository?
examples/catalogue.rs (line 50)
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
fn main() {
    let coffee = Product::new("Coffee", c(250), 0.19);
    let tee = Product::new("Tea", c(175), 0.19);
    let water = Product::new("Water", c(61), 0.19);
    let applejuice = Product::new("AppleJuice", c(164), 0.19);
    let orangejuice = Product::new("OrangeJuice", c(186), 0.19);
    let bagel = Product::new("Bagel", c(219), 0.19);
    let sandwich = Product::new("Sandwich", c(340), 0.19);
    let pie = Product::new("pie", c(94), 0.19);
    let soup = Product::new("Soup", c(310), 0.19);
    let service = Product::new("Service", c(800), 0.00);

    let mut offer = Bill::new();
    offer.add_item(8., water);
    offer.add_item(4., applejuice);
    offer.add_item(4., orangejuice);
    offer.add_item(40., sandwich);
    offer.add_item(2., service);

    let mut invoice = Bill::new();
    invoice.add_item(2., water);
    invoice.add_item(0., applejuice);
    invoice.add_item(2., orangejuice);
    invoice.add_item(50., sandwich);
    invoice.add_item(2.5, service);

    let mut invoice2 = Bill::new();
    invoice2.add_item(99.0, Product::new("Red Ballons", c(99), 0.19));

    #[cfg(not(feature = "serialization"))]
    {
        print("offer", &offer);
        print("invoice", &invoice);
        print("invoice2", &invoice2);
    }
    #[cfg(feature = "serialization")]
    {
        println!("{}", serde_json::to_string_pretty(&offer).unwrap());
        println!("{}", serde_json::to_string_pretty(&invoice).unwrap());
        println!("{}", serde_json::to_string_pretty(&invoice2).unwrap());
    }
}
source

pub fn sums_by_tax(&self) -> BTreeMap<Tax, Money>

source

pub fn gross_total(&self) -> Money

Examples found in repository?
examples/catalogue.rs (line 31)
24
25
26
27
28
29
30
31
32
33
34
35
fn print(title: &str, bill: &Bill<Product<'_>>) {
    println!("{}:", title);
    for (tax, items) in &bill.items_by_tax {
        println!("  {}%", tax);
        print_items(items);
    }
    println!("---------------------------------------");
    println!("       {}", bill.gross_total().postfix());
    println!("     + {} (tax)", bill.tax_total().postfix());
    println!("   net {}", bill.net_total().postfix());
    println!();
}
source

pub fn tax_total(&self) -> Money

Examples found in repository?
examples/catalogue.rs (line 32)
24
25
26
27
28
29
30
31
32
33
34
35
fn print(title: &str, bill: &Bill<Product<'_>>) {
    println!("{}:", title);
    for (tax, items) in &bill.items_by_tax {
        println!("  {}%", tax);
        print_items(items);
    }
    println!("---------------------------------------");
    println!("       {}", bill.gross_total().postfix());
    println!("     + {} (tax)", bill.tax_total().postfix());
    println!("   net {}", bill.net_total().postfix());
    println!();
}
source

pub fn net_total(&self) -> Money

Examples found in repository?
examples/catalogue.rs (line 33)
24
25
26
27
28
29
30
31
32
33
34
35
fn print(title: &str, bill: &Bill<Product<'_>>) {
    println!("{}:", title);
    for (tax, items) in &bill.items_by_tax {
        println!("  {}%", tax);
        print_items(items);
    }
    println!("---------------------------------------");
    println!("       {}", bill.gross_total().postfix());
    println!("     + {} (tax)", bill.tax_total().postfix());
    println!("   net {}", bill.net_total().postfix());
    println!();
}

Methods from Deref<Target = BTreeMap<Tax, ItemList<P>>>ยง

1.0.0 ยท source

pub fn get<Q>(&self, key: &Q) -> Option<&V>where K: Borrow<Q> + Ord, Q: Ord + ?Sized,

Returns a reference to the value corresponding to the key.

The key may be any borrowed form of the mapโ€™s key type, but the ordering on the borrowed form must match the ordering on the key type.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut map = BTreeMap::new();
map.insert(1, "a");
assert_eq!(map.get(&1), Some(&"a"));
assert_eq!(map.get(&2), None);
1.40.0 ยท source

pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>where K: Borrow<Q> + Ord, Q: Ord + ?Sized,

Returns the key-value pair corresponding to the supplied key.

The supplied key may be any borrowed form of the mapโ€™s key type, but the ordering on the borrowed form must match the ordering on the key type.

Examples
use std::collections::BTreeMap;

let mut map = BTreeMap::new();
map.insert(1, "a");
assert_eq!(map.get_key_value(&1), Some((&1, &"a")));
assert_eq!(map.get_key_value(&2), None);
1.66.0 ยท source

pub fn first_key_value(&self) -> Option<(&K, &V)>where K: Ord,

Returns the first key-value pair in the map. The key in this pair is the minimum key in the map.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut map = BTreeMap::new();
assert_eq!(map.first_key_value(), None);
map.insert(1, "b");
map.insert(2, "a");
assert_eq!(map.first_key_value(), Some((&1, &"b")));
1.66.0 ยท source

pub fn last_key_value(&self) -> Option<(&K, &V)>where K: Ord,

Returns the last key-value pair in the map. The key in this pair is the maximum key in the map.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut map = BTreeMap::new();
map.insert(1, "b");
map.insert(2, "a");
assert_eq!(map.last_key_value(), Some((&2, &"a")));
1.0.0 ยท source

pub fn contains_key<Q>(&self, key: &Q) -> boolwhere K: Borrow<Q> + Ord, Q: Ord + ?Sized,

Returns true if the map contains a value for the specified key.

The key may be any borrowed form of the mapโ€™s key type, but the ordering on the borrowed form must match the ordering on the key type.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut map = BTreeMap::new();
map.insert(1, "a");
assert_eq!(map.contains_key(&1), true);
assert_eq!(map.contains_key(&2), false);
1.17.0 ยท source

pub fn range<T, R>(&self, range: R) -> Range<'_, K, V>where T: Ord + ?Sized, K: Borrow<T> + Ord, R: RangeBounds<T>,

Constructs a double-ended iterator over a sub-range of elements in the map. The simplest way is to use the range syntax min..max, thus range(min..max) will yield elements from min (inclusive) to max (exclusive). The range may also be entered as (Bound<T>, Bound<T>), so for example range((Excluded(4), Included(10))) will yield a left-exclusive, right-inclusive range from 4 to 10.

Panics

Panics if range start > end. Panics if range start == end and both bounds are Excluded.

Examples

Basic usage:

use std::collections::BTreeMap;
use std::ops::Bound::Included;

let mut map = BTreeMap::new();
map.insert(3, "a");
map.insert(5, "b");
map.insert(8, "c");
for (&key, &value) in map.range((Included(&4), Included(&8))) {
    println!("{key}: {value}");
}
assert_eq!(Some((&5, &"b")), map.range(4..).next());
1.0.0 ยท source

pub fn iter(&self) -> Iter<'_, K, V>

Gets an iterator over the entries of the map, sorted by key.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut map = BTreeMap::new();
map.insert(3, "c");
map.insert(2, "b");
map.insert(1, "a");

for (key, value) in map.iter() {
    println!("{key}: {value}");
}

let (first_key, first_value) = map.iter().next().unwrap();
assert_eq!((*first_key, *first_value), (1, "a"));
1.0.0 ยท source

pub fn keys(&self) -> Keys<'_, K, V>

Gets an iterator over the keys of the map, in sorted order.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut a = BTreeMap::new();
a.insert(2, "b");
a.insert(1, "a");

let keys: Vec<_> = a.keys().cloned().collect();
assert_eq!(keys, [1, 2]);
1.0.0 ยท source

pub fn values(&self) -> Values<'_, K, V>

Gets an iterator over the values of the map, in order by key.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut a = BTreeMap::new();
a.insert(1, "hello");
a.insert(2, "goodbye");

let values: Vec<&str> = a.values().cloned().collect();
assert_eq!(values, ["hello", "goodbye"]);
1.0.0 ยท source

pub fn len(&self) -> usize

Returns the number of elements in the map.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut a = BTreeMap::new();
assert_eq!(a.len(), 0);
a.insert(1, "a");
assert_eq!(a.len(), 1);
1.0.0 ยท source

pub fn is_empty(&self) -> bool

Returns true if the map contains no elements.

Examples

Basic usage:

use std::collections::BTreeMap;

let mut a = BTreeMap::new();
assert!(a.is_empty());
a.insert(1, "a");
assert!(!a.is_empty());
source

pub fn lower_bound<Q>(&self, bound: Bound<&Q>) -> Cursor<'_, K, V>where K: Borrow<Q> + Ord, Q: Ord,

๐Ÿ”ฌThis is a nightly-only experimental API. (btree_cursors)

Returns a Cursor pointing at the first element that is above the given bound.

If no such element exists then a cursor pointing at the โ€œghostโ€ non-element is returned.

Passing Bound::Unbounded will return a cursor pointing at the first element of the map.

Examples

Basic usage:

#![feature(btree_cursors)]

use std::collections::BTreeMap;
use std::ops::Bound;

let mut a = BTreeMap::new();
a.insert(1, "a");
a.insert(2, "b");
a.insert(3, "c");
a.insert(4, "c");
let cursor = a.lower_bound(Bound::Excluded(&2));
assert_eq!(cursor.key(), Some(&3));
source

pub fn upper_bound<Q>(&self, bound: Bound<&Q>) -> Cursor<'_, K, V>where K: Borrow<Q> + Ord, Q: Ord,

๐Ÿ”ฌThis is a nightly-only experimental API. (btree_cursors)

Returns a Cursor pointing at the last element that is below the given bound.

If no such element exists then a cursor pointing at the โ€œghostโ€ non-element is returned.

Passing Bound::Unbounded will return a cursor pointing at the last element of the map.

Examples

Basic usage:

#![feature(btree_cursors)]

use std::collections::BTreeMap;
use std::ops::Bound;

let mut a = BTreeMap::new();
a.insert(1, "a");
a.insert(2, "b");
a.insert(3, "c");
a.insert(4, "c");
let cursor = a.upper_bound(Bound::Excluded(&3));
assert_eq!(cursor.key(), Some(&2));

Trait Implementationsยง

sourceยง

impl<P: Debug> Debug for Bill<P>

sourceยง

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
sourceยง

impl<P: Default> Default for Bill<P>

sourceยง

fn default() -> Bill<P>

Returns the โ€œdefault valueโ€ for a type. Read more
sourceยง

impl<P: BillProduct> Deref for Bill<P>

ยง

type Target = BTreeMap<Tax, ItemList<P>, Global>

The resulting type after dereferencing.
sourceยง

fn deref(&self) -> &BTreeMap<Tax, ItemList<P>>

Dereferences the value.

Auto Trait Implementationsยง

ยง

impl<P> RefUnwindSafe for Bill<P>where P: RefUnwindSafe,

ยง

impl<P> Send for Bill<P>where P: Send,

ยง

impl<P> Sync for Bill<P>where P: Sync,

ยง

impl<P> Unpin for Bill<P>

ยง

impl<P> UnwindSafe for Bill<P>where P: RefUnwindSafe,

Blanket Implementationsยง

sourceยง

impl<T> Any for Twhere T: 'static + ?Sized,

sourceยง

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
sourceยง

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable ยท sourceยง

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
sourceยง

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable ยท sourceยง

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
sourceยง

impl<T> From<T> for T

const: unstable ยท sourceยง

fn from(t: T) -> T

Returns the argument unchanged.

sourceยง

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable ยท sourceยง

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

sourceยง

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

ยง

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable ยท sourceยง

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
sourceยง

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

ยง

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable ยท sourceยง

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.