Made document able to hold more than just data.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1s

This commit is contained in:
Jeff Baskin 2025-09-21 10:12:07 -04:00
parent 5b4e994685
commit a153e23d38

View File

@ -1288,14 +1288,14 @@ impl Addition {
} }
} }
fn add_field<F>(&mut self, name: String, field: F) fn add_field<CV>(&mut self, name: String, field: CV)
where where
F: Into<Field>, CV: Into<CalcValue>,
{ {
self.data.add_field(name, field); self.data.add_field(name, field);
} }
fn get_field(&self, name: &str) -> Option<&Field> { fn get_field(&self, name: &str) -> Option<Field> {
self.data.get_field(name) self.data.get_field(name)
} }
@ -1316,7 +1316,7 @@ mod additions {
add.add_field(name.clone(), data.clone()); add.add_field(name.clone(), data.clone());
let result = add.get_field(&name).unwrap(); let result = add.get_field(&name).unwrap();
match result { match result {
Field::StaticString(result) => assert_eq!(result, &data), Field::StaticString(result) => assert_eq!(result, data),
_ => unreachable!("got {:?}: should have received static string", result), _ => unreachable!("got {:?}: should have received static string", result),
} }
} }
@ -1328,7 +1328,7 @@ mod additions {
add.add_field(name.clone(), data.clone()); add.add_field(name.clone(), data.clone());
let result = add.get_field(&name).unwrap(); let result = add.get_field(&name).unwrap();
match result { match result {
Field::Uuid(result) => assert_eq!(result, &data), Field::Uuid(result) => assert_eq!(result, data),
_ => unreachable!("got {:?}: should have received uuid", result), _ => unreachable!("got {:?}: should have received uuid", result),
} }
} }
@ -1340,7 +1340,7 @@ mod additions {
add.add_field(name.clone(), data.clone()); add.add_field(name.clone(), data.clone());
let doc: Document = add.get_document(); let doc: Document = add.get_document();
match doc.get_field(&name).unwrap() { match doc.get_field(&name).unwrap() {
Field::Uuid(result) => assert_eq!(result, &data), Field::Uuid(result) => assert_eq!(result, data),
_ => unreachable!("should have received uuid"), _ => unreachable!("should have received uuid"),
} }
} }
@ -2204,7 +2204,7 @@ mod replies {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
struct Document { struct Document {
data: HashMap<String, Field>, data: HashMap<String, CalcValue>,
} }
impl Document { impl Document {
@ -2214,19 +2214,50 @@ impl Document {
} }
} }
fn add_field<F>(&mut self, name: String, field: F) fn add_field<CV>(&mut self, name: String, field: CV)
where where
F: Into<Field>, CV: Into<CalcValue>,
{ {
self.data.insert(name, field.into()); self.data.insert(name, field.into());
} }
fn get_field(&self, name: &str) -> Option<&Field> { fn get_field(&self, name: &str) -> Option<Field> {
self.data.get(name) match self.data.get(name) {
Some(data) => Some(data.get()),
None => None,
}
} }
fn iter(&self) -> impl Iterator<Item = (&String, &Field)> { fn get_all(&self) -> Vec<(String, Field)> {
self.data.iter() let mut output = Vec::new();
for (key, value) in self.data.iter() {
output.push((key.clone(), value.get()));
}
output
}
fn iter(&self) -> DocIter {
DocIter::new(self)
}
}
struct DocIter {
storage: Vec<(String, Field)>,
}
impl DocIter {
fn new(doc: &Document) -> Self {
Self {
storage: doc.get_all(),
}
}
}
impl Iterator for DocIter {
type Item = (String, Field);
fn next(&mut self) -> Option<Self::Item> {
self.storage.pop()
} }
} }
@ -2242,7 +2273,7 @@ mod documents {
add.add_field(name.clone(), data.clone()); add.add_field(name.clone(), data.clone());
let result = add.get_field(&name).unwrap(); let result = add.get_field(&name).unwrap();
match result { match result {
Field::StaticString(result) => assert_eq!(result, &data), Field::StaticString(result) => assert_eq!(result, data),
_ => unreachable!("got {:?}: should have received static string", result), _ => unreachable!("got {:?}: should have received static string", result),
} }
} }
@ -2254,7 +2285,7 @@ mod documents {
add.add_field(name.clone(), data.clone()); add.add_field(name.clone(), data.clone());
let result = add.get_field(&name).unwrap(); let result = add.get_field(&name).unwrap();
match result { match result {
Field::Uuid(result) => assert_eq!(result, &data), Field::Uuid(result) => assert_eq!(result, data),
_ => unreachable!("got {:?}: should have received uuid", result), _ => unreachable!("got {:?}: should have received uuid", result),
} }
} }
@ -2673,7 +2704,7 @@ impl DocumentFile {
let mut holder = Document::new(); let mut holder = Document::new();
let doc = addition.get_document(); let doc = addition.get_document();
for (key, value) in doc.iter() { for (key, value) in doc.iter() {
match self.validate(key, Some(value.clone())) { match self.validate(&key, Some(value.clone())) {
Ok(data) => { Ok(data) => {
holder.add_field(key.clone(), value.clone()); holder.add_field(key.clone(), value.clone());
} }
@ -2695,7 +2726,7 @@ impl DocumentFile {
} }
self.docs.insert(oid.clone(), holder.clone()); self.docs.insert(oid.clone(), holder.clone());
for (key, value) in holder.iter() { for (key, value) in holder.iter() {
self.add_to_index(key, value.clone(), oid.clone()); self.add_to_index(&key, value.clone(), oid.clone());
} }
let mut reply = Reply::new(); let mut reply = Reply::new();
reply.add(holder); reply.add(holder);
@ -2760,10 +2791,10 @@ impl DocumentFile {
for (oid, docs) in holder.iter_mut() { for (oid, docs) in holder.iter_mut() {
let mut updated = Document::new(); let mut updated = Document::new();
for (key, value) in update.get_values().iter() { for (key, value) in update.get_values().iter() {
match self.validate(key, Some(value.clone())) { match self.validate(&key, Some(value.clone())) {
Ok(field) => match index_holder.validate(key, &field) { Ok(field) => match index_holder.validate(&key, &field) {
Ok(_) => { Ok(_) => {
index_holder.add_to_index(key, field.clone(), oid.clone()); index_holder.add_to_index(&key, field.clone(), oid.clone());
docs[1].add_field(key.clone(), field.clone()); docs[1].add_field(key.clone(), field.clone());
} }
Err(err) => return Self::add_field_to_error(key.to_string(), err).into(), Err(err) => return Self::add_field_to_error(key.to_string(), err).into(),
@ -2777,8 +2808,8 @@ impl DocumentFile {
self.docs.insert(oid.clone(), docs[1].clone()); self.docs.insert(oid.clone(), docs[1].clone());
reply.add(docs[1].clone()); reply.add(docs[1].clone());
for (key, value) in docs[0].iter() { for (key, value) in docs[0].iter() {
self.remove_from_index(key, value, oid); self.remove_from_index(&key, &value, oid);
self.add_to_index(key, docs[1].get_field(key).unwrap().clone(), oid.clone()); self.add_to_index(&key, docs[1].get_field(&key).unwrap().clone(), oid.clone());
} }
} }
reply.into() reply.into()
@ -3007,7 +3038,7 @@ mod document_files {
let holder = output.iter().next().unwrap(); let holder = output.iter().next().unwrap();
match holder.get_field(name) { match holder.get_field(name) {
Some(field) => match field { Some(field) => match field {
Field::Uuid(store) => assert_eq!(store, &data), Field::Uuid(store) => assert_eq!(store, data),
_ => unreachable!( _ => unreachable!(
"got {:?}: should have received uuid", "got {:?}: should have received uuid",
holder.get_field(name).unwrap() holder.get_field(name).unwrap()
@ -3028,7 +3059,7 @@ mod document_files {
let holder = output.iter().next().unwrap(); let holder = output.iter().next().unwrap();
match holder.get_field(name) { match holder.get_field(name) {
Some(field) => match field { Some(field) => match field {
Field::Uuid(store) => assert_eq!(store, &data), Field::Uuid(store) => assert_eq!(store, data),
_ => unreachable!( _ => unreachable!(
"got {:?}: should have received uuid", "got {:?}: should have received uuid",
holder.get_field(name).unwrap() holder.get_field(name).unwrap()
@ -3176,7 +3207,7 @@ mod document_files {
action action
); );
for doc in data.iter() { for doc in data.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &expected); assert_eq!(doc.get_field("field0").unwrap(), expected);
} }
} }
_ => unreachable!("got {:?}: should have been a reply", action), _ => unreachable!("got {:?}: should have been a reply", action),
@ -3212,7 +3243,7 @@ mod document_files {
MsgAction::Reply(data) => { MsgAction::Reply(data) => {
assert_eq!(data.len(), 4, "should return 4 entries"); assert_eq!(data.len(), 4, "should return 4 entries");
for doc in data.iter() { for doc in data.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &input); assert_eq!(doc.get_field("field0").unwrap(), input);
} }
} }
_ => unreachable!("got {:?}: should have been a reply", action), _ => unreachable!("got {:?}: should have been a reply", action),
@ -3249,8 +3280,8 @@ mod document_files {
let bfield: Field = "b".into(); let bfield: Field = "b".into();
assert_eq!(data.len(), 1, "should return one entry:\n{:?}", action); assert_eq!(data.len(), 1, "should return one entry:\n{:?}", action);
for doc in data.iter() { for doc in data.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &afield); assert_eq!(doc.get_field("field0").unwrap(), afield);
assert_eq!(doc.get_field("field1").unwrap(), &bfield); assert_eq!(doc.get_field("field1").unwrap(), bfield);
} }
} }
_ => unreachable!("got {:?}: should have been a reply", action), _ => unreachable!("got {:?}: should have been a reply", action),
@ -3320,7 +3351,7 @@ mod document_files {
assert_eq!(docs.len(), 1); assert_eq!(docs.len(), 1);
for doc in docs.iter() { for doc in docs.iter() {
let expected: Field = "".into(); let expected: Field = "".into();
assert_eq!(doc.get_field("field0").unwrap(), &expected); assert_eq!(doc.get_field("field0").unwrap(), expected);
} }
} }
_ => unreachable!("got {:?}: should have gotten a reply", action), _ => unreachable!("got {:?}: should have gotten a reply", action),
@ -3345,7 +3376,7 @@ mod document_files {
assert_eq!(docs.len(), 1); assert_eq!(docs.len(), 1);
let expected: Field = input.into(); let expected: Field = input.into();
for doc in docs.iter() { for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &expected); assert_eq!(doc.get_field("field0").unwrap(), expected);
} }
} }
_ => unreachable!("got {:?}: should have gotten a reply", action), _ => unreachable!("got {:?}: should have gotten a reply", action),
@ -3370,7 +3401,7 @@ mod document_files {
assert_eq!(docs.len(), 1); assert_eq!(docs.len(), 1);
let expected: Field = Uuid::nil().into(); let expected: Field = Uuid::nil().into();
for doc in docs.iter() { for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &expected); assert_eq!(doc.get_field("field0").unwrap(), expected);
} }
} }
_ => unreachable!("got {:?}: should have gotten a reply", action), _ => unreachable!("got {:?}: should have gotten a reply", action),
@ -3465,8 +3496,8 @@ mod document_files {
MsgAction::Reply(docs) => { MsgAction::Reply(docs) => {
assert_eq!(docs.len(), 1, "{}", key); assert_eq!(docs.len(), 1, "{}", key);
for doc in docs.iter() { for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &expected_id, "{}", key); assert_eq!(doc.get_field("field0").unwrap(), expected_id, "{}", key);
assert_eq!(doc.get_field("field1").unwrap(), &output, "{}", key); assert_eq!(doc.get_field("field1").unwrap(), output, "{}", key);
} }
} }
_ => unreachable!("got {:?}: should have gotten a reply", action), _ => unreachable!("got {:?}: should have gotten a reply", action),
@ -3515,8 +3546,8 @@ mod document_files {
let expected_id: Field = expected.clone().into(); let expected_id: Field = expected.clone().into();
let output: Field = new.into(); let output: Field = new.into();
for doc in docs.iter() { for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &expected_id); assert_eq!(doc.get_field("field0").unwrap(), expected_id);
assert_eq!(doc.get_field("field1").unwrap(), &output); assert_eq!(doc.get_field("field1").unwrap(), output);
} }
} }
_ => unreachable!("got {:?}: should have gotten a reply", action), _ => unreachable!("got {:?}: should have gotten a reply", action),
@ -3562,8 +3593,8 @@ mod document_files {
MsgAction::Reply(docs) => { MsgAction::Reply(docs) => {
assert_eq!(docs.len(), count, "{}", key); assert_eq!(docs.len(), count, "{}", key);
for doc in docs.iter() { for doc in docs.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &expected_id, "{}", key); assert_eq!(doc.get_field("field0").unwrap(), expected_id, "{}", key);
assert_eq!(doc.get_field("field1").unwrap(), &output, "{}", key); assert_eq!(doc.get_field("field1").unwrap(), output, "{}", key);
} }
} }
_ => unreachable!("got {:?}: should have gotten a reply", action), _ => unreachable!("got {:?}: should have gotten a reply", action),
@ -3704,7 +3735,7 @@ mod document_files {
MsgAction::Reply(data) => { MsgAction::Reply(data) => {
assert_eq!(data.len(), 1); assert_eq!(data.len(), 1);
for doc in data.iter() { for doc in data.iter() {
assert_eq!(doc.get_field("field0").unwrap(), &fold); assert_eq!(doc.get_field("field0").unwrap(), fold);
} }
} }
_ => unreachable!("got {:?}: should have gotten a reply", action), _ => unreachable!("got {:?}: should have gotten a reply", action),
@ -3774,7 +3805,7 @@ mod document_files {
assert_eq!(data.len(), ids.len()); assert_eq!(data.len(), ids.len());
for doc in data.iter() { for doc in data.iter() {
match doc.get_field("field0").unwrap() { match doc.get_field("field0").unwrap() {
Field::Uuid(id) => assert!(ids.contains(id)), Field::Uuid(id) => assert!(ids.contains(&id)),
_ => unreachable!("did not get uuid"), _ => unreachable!("did not get uuid"),
} }
} }