Skip to content

Commit bb8fd30

Browse files
authored
Merge pull request #3
Refactor into generic DataSource
2 parents 512e09f + 0614abd commit bb8fd30

File tree

13 files changed

+405
-703
lines changed

13 files changed

+405
-703
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ edition = "2021"
1010
nom = "7.1.3"
1111
nom-unicode = "0.3.0"
1212
backtrace = "0.3.74"
13-
smallvec = "2.0.0-alpha.7"
1413

1514
[profile.dev]
1615
opt-level = 0

examples/parse.rs

Lines changed: 29 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,47 @@
1-
use std::{
2-
cell::RefCell,
3-
rc::Rc
4-
};
5-
use std::io::Write;
61
use expression::{
2+
eval::Object,
73
Context,
8-
DataSource,
9-
Row,
10-
eval::Object
4+
DataSource
115
};
6+
use std::io::Write;
127

13-
/// This struct implements a friendly way to represent a row of a table.
14-
/// The `Row` trait marks this structure with the necessary methods to be useful
15-
///
16-
/// This example uses interior mutability because `DataSource` trait works with owned types such as `Rc`s.
17-
#[derive(Clone)]
18-
struct ExampleRow {
19-
inner: Rc<RefCell<RowInner>>
20-
}
21-
22-
struct RowInner {
23-
col1: String,
24-
col2: f64
25-
}
26-
27-
impl Row for ExampleRow {
28-
fn fields(&self) -> impl Iterator<Item = impl AsRef<str>> + Clone {
29-
vec!["col1", "col2"].into_iter()
30-
}
31-
32-
fn get(&self, field: &str) -> Option<Object> {
33-
let inner = self.inner.borrow();
34-
35-
match field {
36-
"col1" => Some(Object::String(inner.col1.clone())),
37-
"col2" => Some(Object::Number(inner.col2)),
38-
_ => None
39-
}
40-
}
41-
}
42-
43-
struct ExampleProvider<Rows: Row> {
44-
columns: Vec<String>,
45-
rows: Vec<Rows>,
8+
struct ExampleProvider {
9+
values: Vec<String>
4610
}
4711

48-
impl<Rows: Row + Clone> DataSource for ExampleProvider<Rows> {
49-
type Rows = Rows;
50-
51-
fn list_columns(&self) -> impl Iterator<Item=impl AsRef<str>> {
52-
self.columns.clone().into_iter()
53-
}
54-
55-
fn rows(&self) -> impl Iterator<Item=Self::Rows> {
56-
self.rows.iter()
57-
.cloned()
58-
}
59-
60-
fn row(&self, row: usize) -> Option<Self::Rows> {
61-
self.rows.get(row)
62-
.cloned()
63-
}
12+
impl DataSource for ExampleProvider {
13+
fn query(&self, query: impl AsRef<str>) -> Option<Object> {
14+
let index = query.as_ref().parse::<usize>().ok()?;
6415

65-
fn num_rows(&self) -> usize {
66-
self.rows.len()
16+
self.values.get(index)
17+
.map(|i| Object::String(i.clone()))
6718
}
6819
}
6920

70-
pub fn main() {
71-
let cx = Context::new(ExampleProvider::<ExampleRow> {
72-
columns: vec![
73-
"col1".to_owned(),
74-
"col2".to_owned(),
75-
],
76-
rows: vec![]
21+
pub fn main() -> std::io::Result<()> {
22+
let cx = Context::new(ExampleProvider {
23+
values: Vec::new()
7724
});
7825

7926
let parser = cx.parse_context();
8027

81-
let program = std::env::args().nth(1).unwrap();
28+
let mut buffer = String::new();
29+
30+
eprint!("> ");
31+
std::io::stderr().flush()?;
8232

83-
print!("{}: ", &program);
84-
std::io::stdout().flush().unwrap();
33+
while let Ok(len) = std::io::stdin().read_line(&mut buffer) {
34+
let program = buffer[0..len].trim();
8535

86-
match parser.parse(program) {
87-
Ok(result) => println!("{:#?}", result),
88-
Err(err) => println!("Error: {:?}", err)
36+
match parser.parse(program) {
37+
Ok(result) => println!("{:#?}", result),
38+
Err(err) => println!("Error: {:?}", err)
39+
}
40+
41+
eprint!("> ");
42+
std::io::stderr().flush()?;
43+
buffer.clear();
8944
}
45+
46+
Ok(())
9047
}

examples/repl.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use std::io::Write;
2+
use expression::{
3+
Context,
4+
DataSource,
5+
eval::Object
6+
};
7+
8+
struct RowInner {
9+
col1: String,
10+
col2: f64
11+
}
12+
13+
struct ExampleProvider {
14+
values: Vec<String>
15+
}
16+
17+
impl DataSource for ExampleProvider {
18+
fn query(&self, query: impl AsRef<str>) -> Option<Object> {
19+
let index = query.as_ref().parse::<usize>().ok()?;
20+
21+
self.values.get(index)
22+
.map(|i| Object::String(i.clone()))
23+
}
24+
}
25+
26+
pub fn main() -> std::io::Result<()> {
27+
let cx = Context::new(ExampleProvider {
28+
values: vec![]
29+
});
30+
31+
let mut buffer = String::new();
32+
33+
eprint!("> ");
34+
std::io::stderr().flush()?;
35+
36+
while let Ok(len) = std::io::stdin().read_line(&mut buffer) {
37+
let program = buffer[0..len].trim();
38+
39+
match cx.evaluate(program) {
40+
Ok(result) => println!("{:#?}", result),
41+
Err(err) => println!("Error: {:?}", err)
42+
}
43+
44+
eprint!("> ");
45+
std::io::stderr().flush()?;
46+
buffer.clear();
47+
}
48+
49+
Ok(())
50+
}

examples/simple.rs

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)