macroonz_compiler/token/generation/
project.rs1use super::compose::{comma_many, group};
6use super::{GENERATED_TOKEN_LIMIT, GeneratedDelimiter, GeneratedRowRefusal, GeneratedToken};
7use crate::bounded::{KeyedRoster, KeyedRosterAssignment, NonEmpty, NonEmptyError, Overflow};
8
9pub fn keyed_roster_slice<T, K, const N: usize>(
17 roster: &KeyedRoster<T, K, N>,
18 mut row: impl FnMut(usize, &K, &T) -> Result<Vec<GeneratedToken>, Overflow>,
19) -> Result<Vec<GeneratedToken>, Overflow> {
20 let rows = roster
21 .indexed()
22 .map(|(index, key, member)| row(index, key, member))
23 .collect::<Result<Vec<_>, _>>()?;
24 borrowed_slice(rows)
25}
26
27pub fn keyed_roster_items<T, K, const N: usize>(
35 roster: &KeyedRoster<T, K, N>,
36 mut row: impl FnMut(usize, &K, &T) -> Result<Vec<GeneratedToken>, Overflow>,
37) -> Result<Vec<GeneratedToken>, GeneratedRowRefusal> {
38 let mut items = Vec::new();
39 for (index, key, member) in roster.indexed() {
40 let row = row(index, key, member)
41 .map_err(|cause| GeneratedRowRefusal::at(index, NonEmptyError::Overflow(cause)))?;
42 let row = NonEmpty::<GeneratedToken, GENERATED_TOKEN_LIMIT>::new(row)
43 .map_err(|cause| GeneratedRowRefusal::at(index, cause))?;
44 items.extend(row.iter().cloned());
45 }
46 Ok(items)
47}
48
49pub fn keyed_assignment_slice<D, K, P, S, const N: usize>(
57 assignment: &KeyedRosterAssignment<D, K, P, S, N>,
58 mut row: impl FnMut(usize, &K, &D, &S, &P) -> Result<Vec<GeneratedToken>, Overflow>,
59) -> Result<Vec<GeneratedToken>, Overflow> {
60 let rows = assignment
61 .indexed()
62 .map(|(index, key, member, seat, payload)| row(index, key, member, seat, payload))
63 .collect::<Result<Vec<_>, _>>()?;
64 borrowed_slice(rows)
65}
66
67pub fn keyed_assignment_items<D, K, P, S, const N: usize>(
75 assignment: &KeyedRosterAssignment<D, K, P, S, N>,
76 mut row: impl FnMut(usize, &K, &D, &S, &P) -> Result<Vec<GeneratedToken>, Overflow>,
77) -> Result<Vec<GeneratedToken>, GeneratedRowRefusal> {
78 let mut items = Vec::new();
79 for (index, key, member, seat, payload) in assignment.indexed() {
80 let row = row(index, key, member, seat, payload)
81 .map_err(|cause| GeneratedRowRefusal::at(index, NonEmptyError::Overflow(cause)))?;
82 let row = NonEmpty::<GeneratedToken, GENERATED_TOKEN_LIMIT>::new(row)
83 .map_err(|cause| GeneratedRowRefusal::at(index, cause))?;
84 items.extend(row.iter().cloned());
85 }
86 Ok(items)
87}
88
89fn borrowed_slice(rows: Vec<Vec<GeneratedToken>>) -> Result<Vec<GeneratedToken>, Overflow> {
91 Ok(vec![
92 GeneratedToken::alone('&'),
93 group(GeneratedDelimiter::Bracket, comma_many(rows))?,
94 ])
95}