- Avoid lifetime parameter for Source, Span. Use Rc instead.
- Engine for simplified API

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
Anand Krishnamoorthi
2023-11-07 23:15:28 -08:00
committed by GitHub
parent a751cd69e1
commit d69b413c8e
15 changed files with 721 additions and 690 deletions

View File

@@ -210,11 +210,7 @@ pub fn eval_file_first_rule(
for (idx, file) in files.iter().enumerate() {
let contents = regos[idx].as_str();
sources.push(Source {
file,
contents,
lines: contents.split('\n').collect(),
});
sources.push(Source::new(file.to_string(), contents.to_string()));
}
for source in &sources {
@@ -226,13 +222,9 @@ pub fn eval_file_first_rule(
modules_ref.push(m);
}
let query_source = regorus::Source {
file: "<query.rego>",
contents: query,
lines: query.split('\n').collect(),
};
let query_source = regorus::Source::new("<query.rego>".to_string(), query.to_string());
let query_span = regorus::Span {
source: &query_source,
source: query_source.clone(),
line: 1,
col: 1,
start: 0,
@@ -303,11 +295,7 @@ pub fn eval_file(
for (idx, file) in files.iter().enumerate() {
let contents = regos[idx].as_str();
sources.push(Source {
file,
contents,
lines: contents.split('\n').collect(),
});
sources.push(Source::new(file.to_string(), contents.to_string()));
}
for source in &sources {
@@ -319,13 +307,9 @@ pub fn eval_file(
modules_ref.push(m);
}
let query_source = regorus::Source {
file: "<query.rego>",
contents: query,
lines: query.split('\n').collect(),
};
let query_source = regorus::Source::new("<query.rego".to_string(), query.to_string());
let query_span = regorus::Span {
source: &query_source,
source: query_source.clone(),
line: 1,
col: 1,
start: 0,

View File

@@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
use std::env;
use test_generator::test_resources;
fn get_tokens<'source>(source: &'source Source<'source>) -> Result<Vec<Token<'source>>> {
fn get_tokens(source: &Source) -> Result<Vec<Token>> {
let mut tokens = vec![];
let mut lex = Lexer::new(source);
loop {
@@ -35,7 +35,9 @@ fn check_loc(tok: &Token) -> Result<()> {
false if tok.0 == TokenKind::Eof && source_idx >= source_line.len() => return Ok(()),
// Handle case where a raw string's first char is a newline.
false if tok.0 == TokenKind::RawString && &tok.1.text()[0..1] == "\n" => return Ok(()),
_ => bail!("could not find caret for {tok:#?} {msg}"),
_ => {
bail!("could not find caret for {tok:#?} {msg}");
}
}
match &caret_line[idx..idx + 1] {
"^" => {
@@ -76,12 +78,7 @@ fn yaml_test_impl(file: &str) -> Result<()> {
let test: Test = serde_yaml::from_str(&yaml)?;
for case in &test.cases {
let source = Source {
file: "case.rego",
contents: case.rego.as_str(),
lines: case.rego.as_str().split('\n').collect(),
};
let source = Source::new("case.rego".to_string(), case.rego.clone());
print!("case {} ", &case.note);
match get_tokens(&source) {
@@ -91,7 +88,7 @@ fn yaml_test_impl(file: &str) -> Result<()> {
break;
}
assert_eq!(
tok.1.text(),
*tok.1.text(),
case.tokens[idx],
"{} Expected token `{}` not found",
source.message(tok.1.line, tok.1.col, "mismatch-error", &case.tokens[idx]),
@@ -184,11 +181,7 @@ fn run(path: &str) {
#[test]
fn debug() -> Result<()> {
let rego = "\"This string is 35 characters long.\"\"short string\"";
let source = Source {
file: "case.rego",
contents: rego,
lines: rego.split('\n').collect(),
};
let source = Source::new("case.rego".to_string(), rego.to_string());
let mut lexer = Lexer::new(&source);
let tok = lexer.next_token()?;
@@ -210,11 +203,7 @@ fn debug() -> Result<()> {
#[test]
fn tab() -> Result<()> {
let rego = r#" "This string is 35 characters long."`raw string`p"#;
let source = Source {
file: "case.rego",
contents: rego,
lines: rego.split('\n').collect(),
};
let source = Source::new("case.rego".to_string(), rego.to_string());
let mut lexer = Lexer::new(&source);
@@ -244,11 +233,7 @@ fn tab() -> Result<()> {
#[test]
fn invalid_line() -> Result<()> {
let rego = "";
let source = Source {
file: "case.rego",
contents: rego,
lines: rego.split('\n').collect(),
};
let source = Source::new("case.rego".to_string(), rego.to_string());
assert_eq!(
source.message(2, 0, "", ""),

View File

@@ -28,7 +28,7 @@ fn match_span(s: &Span, v: &Value) -> Result<()> {
match &v {
Value::String(vs) => {
my_assert_eq!(
s.text(),
*s.text(),
vs,
"{}",
s.source
@@ -37,7 +37,7 @@ fn match_span(s: &Span, v: &Value) -> Result<()> {
}
_ => {
my_assert_eq!(
s.text(),
*s.text(),
serde_json::to_string_pretty(v)?,
"{}",
s.source
@@ -629,11 +629,7 @@ fn yaml_test_impl(file: &str) -> Result<()> {
for case in &test.cases {
print!("\ncase {} ", case.note);
let source = Source {
file: "case.rego",
contents: case.rego.as_str(),
lines: case.rego.split('\n').collect(),
};
let source = Source::new("case.rego".to_string(), case.rego.clone());
let mut parser = Parser::new(&source)?;
match parser.parse() {
Ok(module) => {

View File

@@ -32,20 +32,10 @@ fn to_string_set(s: &BTreeSet<&str>) -> BTreeSet<String> {
}
fn analyze_file(regos: &[String], expected_scopes: &[Scope]) -> Result<()> {
let mut files = vec![];
let mut sources = vec![];
let mut modules = vec![];
for (idx, _) in regos.iter().enumerate() {
files.push(format!("rego_{idx}"));
}
for (idx, file) in files.iter().enumerate() {
let contents = regos[idx].as_str();
sources.push(Source {
file,
contents,
lines: contents.split('\n').collect(),
});
sources.push(Source::new(format!("rego_{idx}"), regos[idx].clone()));
}
for source in &sources {