Relaced Calculation with CalcValue for FieldSettings.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m50s

This commit is contained in:
Jeff Baskin 2025-11-01 02:52:36 -04:00
parent 08d2dbcfd2
commit 012984f6b7

View File

@ -2107,24 +2107,38 @@ mod fields {
#[derive(Clone, Debug)]
struct FieldSetting {
fieldtype: FieldType,
default_value: Option<Calculation>,
default_value: CalcValue,
}
impl FieldSetting {
fn new(ftype: FieldType) -> Self {
Self {
fieldtype: ftype,
default_value: None,
default_value: CalcValue::None,
}
}
fn set_default(&mut self, value: Calculation) -> Result<(), MTTError> {
let data = value.calculate(&Field::None);
match self.validate(Some(data)) {
Ok(_) => {}
Err(err) => return Err(err),
fn set_default<CV>(&mut self, holder: CV) -> Result<(), MTTError> where CV: Into<CalcValue> {
let value = holder.into();
match &value {
CalcValue::Calculate(calc) => {
if self.fieldtype != calc.get_type() {
return Err(MTTError::FieldInvalidType);
}
}
CalcValue::Existing(ftype) | CalcValue::FType(ftype) => {
if &self.fieldtype != ftype {
return Err(MTTError::FieldInvalidType);
}
}
CalcValue::Value(ref item) => {
if item.get_type() != self.fieldtype {
return Err(MTTError::FieldInvalidType);
}
}
CalcValue::None => {},
}
self.default_value = Some(value);
self.default_value = value;
Ok(())
}
@ -2141,8 +2155,8 @@ impl FieldSetting {
Ok(data.clone())
}
None => match &self.default_value {
Some(calc) => Ok(calc.calculate(&Field::None)),
None => Err(MTTError::InvalidNone),
CalcValue::None => Err(MTTError::InvalidNone),
_ => Ok(self.default_value.get(&Field::None)),
},
}
}
@ -2193,9 +2207,7 @@ mod fieldsettings {
#[test]
fn returns_value_if_default_is_set() {
let mut fset = FieldSetting::new(FieldType::StaticString);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(FieldType::StaticString);
fset.set_default(calc);
fset.set_default(FieldType::StaticString);
match fset.validate(None) {
Ok(data) => assert_eq!(data, "".into()),
Err(err) => unreachable!("got {:?}: should have gotten a value", err),
@ -2206,9 +2218,7 @@ mod fieldsettings {
fn returns_default_value() {
let mut fset = FieldSetting::new(FieldType::StaticString);
let input = "fred";
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(input);
fset.set_default(calc);
fset.set_default(input);
match fset.validate(None) {
Ok(data) => assert_eq!(data, input.into()),
Err(err) => unreachable!("got {:?}: should have gotten a value", err),
@ -2415,7 +2425,7 @@ impl DocDef {
self.fields.get(&id).unwrap().validate(value)
}
fn set_default(&mut self, field_name: &Name, value: Calculation) -> Result<(), MTTError> {
fn set_default<CV>(&mut self, field_name: &Name, value: CV) -> Result<(), MTTError> where CV: Into<CalcValue> {
let id = match self.field_names.get_id(field_name) {
Ok(data) => data,
Err(err) => return Err(err),
@ -2500,9 +2510,7 @@ mod docdefs {
let mut docdef = DocDef::new(docname);
let name = Name::english("defaultfunction");
docdef.add_field(name.clone(), FieldType::StaticString);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(FieldType::StaticString);
docdef.set_default(&name, calc);
docdef.set_default(&name, FieldType::StaticString);
match docdef.get_field(name).unwrap().validate(None) {
Ok(data) => match data {
Field::StaticString(result) => assert_eq!(result, ""),
@ -2512,29 +2520,12 @@ mod docdefs {
}
}
#[test]
fn does_set_default_function_error_on_bad_field_name() {
let docname = Name::english("something");
let mut docdef = DocDef::new(docname);
let field_name = Name::english("wrong");
let calc = Calculation::new(Operand::Assign);
match docdef.set_default(&field_name, calc) {
Ok(_) => unreachable!("should be an error"),
Err(err) => match err {
MTTError::NameNotFound(data) => assert_eq!(data, field_name),
_ => unreachable!("got {:?}: should have been field not found", err),
},
}
}
#[test]
fn does_set_default_value_error_on_bad_field_name() {
let docname = Name::english("something");
let mut docdef = DocDef::new(docname);
let field_name = Name::english(Uuid::new_v4().to_string().as_str());
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(Uuid::new_v4());
match docdef.set_default(&field_name, calc) {
match docdef.set_default(&field_name, FieldType::Uuid) {
Ok(_) => unreachable!("should be an error"),
Err(err) => match err {
MTTError::NameNotFound(data) => assert_eq!(data, field_name),
@ -2549,15 +2540,10 @@ mod docdefs {
let mut docdef = DocDef::new(docname);
let name = Name::english("defaultvalue");
docdef.add_field(name.clone(), FieldType::Uuid);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value("fred");
match docdef.set_default(&name, calc) {
match docdef.set_default(&name, "fred") {
Ok(data) => unreachable!("got {:?}, should be an error", data),
Err(err) => match err {
MTTError::DocumentFieldWrongDataType(expected, got) => {
assert_eq!(expected, FieldType::Uuid);
assert_eq!(got, FieldType::StaticString);
}
MTTError::FieldInvalidType => {},
_ => unreachable!("got {:?}: should have been field not found", err),
},
}
@ -2567,7 +2553,7 @@ mod docdefs {
#[derive(Clone, Debug)]
enum Operand {
Add,
Assign,
//Assign,
Equal,
}
@ -2606,6 +2592,7 @@ enum CalcValue {
Calculate(Calculation),
Existing(FieldType),
FType(FieldType),
None,
Value(Field),
}
@ -2615,6 +2602,7 @@ impl CalcValue {
Self::Calculate(calc) => calc.calculate(existing),
Self::Existing(_) => existing.clone(),
Self::FType(ftype) => ftype.get_default(),
Self::None => Field::None,
Self::Value(field) => field.clone(),
}
}
@ -2624,6 +2612,7 @@ impl CalcValue {
Self::Calculate(calc) => calc.get_type(),
Self::Existing(ftype) => ftype.clone(),
Self::FType(ftype) => ftype.clone(),
Self::None => FieldType::None,
Self::Value(field) => field.into(),
}
}
@ -2926,7 +2915,7 @@ impl Calculation {
}
}
}
Operand::Assign => result = self.values[0].get(existing),
// Operand::Assign => result = self.values[0].get(existing),
Operand::Equal => {
if self.values.len() >= 2 {
result = self.values[0]
@ -2962,9 +2951,9 @@ mod calculations {
#[test]
fn returns_reference_to_operand() {
let calc = Calculation::new(Operand::Assign);
let calc = Calculation::new(Operand::Add);
match calc.operation() {
Operand::Assign => {}
Operand::Add => {}
_ => unreachable!("got {:?}, shold have gotten assign", calc.operation()),
}
let calc = Calculation::new(Operand::Equal);
@ -2974,24 +2963,6 @@ mod calculations {
}
}
#[test]
fn can_assign_value() {
let mut calc = Calculation::new(Operand::Assign);
let data: Field = Uuid::new_v4().into();
calc.add_value(data.clone());
let result = calc.calculate(&Field::None);
assert_eq!(result, data);
}
#[test]
fn can_assign_default_function() {
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(FieldType::Uuid);
let result1 = calc.calculate(&Field::None);
let result2 = calc.calculate(&Field::None);
assert_ne!(result1, result2);
}
#[test]
fn can_equal_true() {
let mut calc = Calculation::new(Operand::Equal);
@ -3196,20 +3167,6 @@ mod queries {
None => unreachable!("should have returned a calculation"),
}
}
#[test]
fn does_not_allow_data_changes() {
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(Uuid::nil());
let mut query = Query::new();
match query.add(Name::english("name"), calc) {
Ok(_) => unreachable!("Should have received an error"),
Err(err) => match err {
MTTError::QueryCannotChangeData => {}
_ => unreachable!("got {:?}, should have gotten cannot change data", err),
},
}
}
}
#[derive(Clone, Debug)]
@ -5012,9 +4969,7 @@ mod document_files {
let mut docdef = DocDef::new(doc_name.clone());
let field_name = Name::english("holder");
docdef.add_field(field_name.clone(), FieldType::StaticString);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(FieldType::StaticString);
docdef.set_default(&field_name, calc);
docdef.set_default(&field_name, FieldType::StaticString);
let mut test_doc: TestDocument = docdef.into();
test_doc.start();
let queue = test_doc.get_queue();
@ -5042,9 +4997,7 @@ mod document_files {
let mut docdef = DocDef::new(doc_name.clone());
let field_name = Name::english("id");
docdef.add_field(field_name.clone(), FieldType::Uuid);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(Uuid::nil());
docdef.set_default(&field_name, calc);
docdef.set_default(&field_name, Uuid::nil());
let mut test_doc: TestDocument = docdef.into();
test_doc.start();
let queue = test_doc.get_queue();
@ -5072,9 +5025,7 @@ mod document_files {
let mut docdef = DocDef::new(doc_name.clone());
let field_name = Name::english("id");
docdef.add_field(field_name.clone(), FieldType::Uuid);
let mut calc = Calculation::new(Operand::Assign);
calc.add_value(FieldType::Uuid);
docdef.set_default(&field_name, calc);
docdef.set_default(&field_name, FieldType::Uuid);
let mut test_doc: TestDocument = docdef.into();
test_doc.start();
let queue = test_doc.get_queue();