Skip to content

Commit dbec59e

Browse files
committed
feat: Update Value(s) to fix select where issue
1 parent 769e6b6 commit dbec59e

File tree

1 file changed

+35
-27
lines changed
  • geekorm-core/src/builder/values

1 file changed

+35
-27
lines changed

geekorm-core/src/builder/values/mod.rs

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{collections::HashMap, fmt::Display, str};
1+
use std::{fmt::Display, str};
22

33
use serde::{Deserialize, Serialize, Serializer};
44

@@ -18,7 +18,7 @@ use crate::{
1818
#[derive(Debug, Clone, Default)]
1919
pub struct Values {
2020
/// List of values
21-
pub(crate) values: HashMap<String, Value>,
21+
pub(crate) values: Vec<Value>,
2222
/// List of columns in the order they were added
2323
pub(crate) order: Vec<String>,
2424
}
@@ -27,20 +27,28 @@ impl Values {
2727
/// Create a new instance of Values
2828
pub fn new() -> Self {
2929
Values {
30-
values: HashMap::new(),
30+
values: Vec::new(),
3131
order: Vec::new(),
3232
}
3333
}
3434

3535
/// Push a value to the list of values
3636
pub fn push(&mut self, column: String, value: impl Into<Value>) {
3737
self.order.push(column.clone());
38-
self.values.insert(column, value.into());
38+
self.values.push(value.into());
3939
}
4040

4141
/// Get a value by index from the list of values
4242
pub fn get(&self, column: &String) -> Option<&Value> {
43-
self.values.get(column)
43+
match self.order.iter().enumerate().find(|(_, o)| *o == column) {
44+
Some((i, _)) => self.values.get(i),
45+
None => None,
46+
}
47+
}
48+
49+
/// Length / Count of the values stored
50+
pub fn len(&self) -> usize {
51+
self.values.len()
4452
}
4553
}
4654

@@ -51,7 +59,8 @@ impl IntoIterator for Values {
5159
fn into_iter(self) -> Self::IntoIter {
5260
self.order
5361
.into_iter()
54-
.map(move |column| self.values[&column].clone())
62+
.enumerate()
63+
.map(move |(index, _)| self.values[index].clone())
5564
.collect::<Vec<Value>>()
5665
.into_iter()
5766
}
@@ -184,28 +193,13 @@ where
184193
}
185194
}
186195

187-
impl From<&Option<String>> for Value {
188-
fn from(value: &Option<String>) -> Self {
189-
match value {
190-
Some(value) => Value::Text(value.to_string()),
191-
None => Value::Null,
192-
}
193-
}
194-
}
195-
196-
impl From<&Option<i32>> for Value {
197-
fn from(value: &Option<i32>) -> Self {
198-
match value {
199-
Some(value) => Value::Integer(*value),
200-
None => Value::Null,
201-
}
202-
}
203-
}
204-
205-
impl From<&Option<bool>> for Value {
206-
fn from(value: &Option<bool>) -> Self {
196+
impl<T> From<&Option<T>> for Value
197+
where
198+
T: Into<Value> + Clone,
199+
{
200+
fn from(value: &Option<T>) -> Self {
207201
match value {
208-
Some(value) => Value::Boolean(if *value { 1 } else { 0 }),
202+
Some(value) => value.clone().into(),
209203
None => Value::Null,
210204
}
211205
}
@@ -375,3 +369,17 @@ impl<'de> Deserialize<'de> for Value {
375369
deserializer.deserialize_any(ValueVisitor)
376370
}
377371
}
372+
373+
#[cfg(test)]
374+
mod tests {
375+
use super::Values;
376+
377+
#[test]
378+
fn test_values() {
379+
let mut values = Values::new();
380+
values.push("id".to_string(), 1);
381+
values.push("name".to_string(), "Bob");
382+
383+
assert_eq!(values.len(), 2);
384+
}
385+
}

0 commit comments

Comments
 (0)