| 100 | } |
| 101 | |
| 102 | fn validate_field(field: &Field, value: &Value) -> Result<Value, ServerError> { |
| 103 | // Try to convert the value if it doesn't match the expected type |
| 104 | let converted_value = match (field.field_type, value) { |
| 105 | // Already correct types |
| 106 | (FieldType::Str, Value::String(_)) |
| 107 | | (FieldType::Number, Value::Number(_)) |
| 108 | | (FieldType::Bool, Value::Bool(_)) |
| 109 | | (FieldType::Array, Value::Array(_)) => value.clone(), |
| 110 | |
| 111 | // Convert string to number |
| 112 | (FieldType::Number, Value::String(s)) => { |
| 113 | // Try parsing as integer first |
| 114 | if let Ok(n) = s.parse::<i64>() { |
| 115 | Value::Number(serde_json::Number::from(n)) |
| 116 | } |
| 117 | // Then try as floating point |
| 118 | else if let Ok(f) = s.parse::<f64>() { |
| 119 | match serde_json::Number::from_f64(f) { |
| 120 | Some(n) => Value::Number(n), |
| 121 | None => { |
| 122 | return Err(ServerError::TypeMismatch { |
| 123 | field: field.name.clone(), |
| 124 | expected: field.field_type.as_str(), |
| 125 | }); |
| 126 | } |
| 127 | } |
| 128 | } |
| 129 | // Cannot parse as number |
| 130 | else { |
| 131 | return Err(ServerError::TypeMismatch { |
| 132 | field: field.name.clone(), |
| 133 | expected: field.field_type.as_str(), |
| 134 | }); |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | // Convert string to boolean |
| 139 | (FieldType::Bool, Value::String(s)) => match s.to_lowercase().as_str() { |
| 140 | "true" /*| "yes" | "1" | "on"*/ => Value::Bool(true), |
| 141 | "false" /*| "no" | "0" | "off"*/ => Value::Bool(false), |
| 142 | _ => { |
| 143 | return Err(ServerError::TypeMismatch { |
| 144 | field: field.name.clone(), |
| 145 | expected: field.field_type.as_str(), |
| 146 | }) |
| 147 | } |
| 148 | }, |
| 149 | |
| 150 | // Convert number to boolean (0 = false, non-zero = true) |
| 151 | (FieldType::Bool, Value::Number(n)) => { |
| 152 | if n.as_f64().unwrap_or(0.0) == 0.0 { |
| 153 | Value::Bool(false) |
| 154 | } else { |
| 155 | Value::Bool(true) |
| 156 | } |
| 157 | } |
| 158 | |
| 159 | // Convert number to string |