difftreelog
build upgrade to 2021 edition
in: master
13 files changed
bindings/jsonnet/Cargo.tomldiffbeforeafterboth--- a/bindings/jsonnet/Cargo.toml
+++ b/bindings/jsonnet/Cargo.toml
@@ -4,7 +4,7 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
+edition = "2021"
publish = false
[dependencies]
cmds/jrsonnet/Cargo.tomldiffbeforeafterboth--- a/cmds/jrsonnet/Cargo.toml
+++ b/cmds/jrsonnet/Cargo.toml
@@ -4,8 +4,7 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
-publish = false
+edition = "2021"
[features]
# Use mimalloc as allocator
crates/jrsonnet-cli/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-cli/Cargo.toml
+++ b/crates/jrsonnet-cli/Cargo.toml
@@ -4,8 +4,7 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
-publish = false
+edition = "2021"
[dependencies]
jrsonnet-evaluator = { path = "../../crates/jrsonnet-evaluator", version = "0.4.2", features = [
crates/jrsonnet-evaluator/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-evaluator/Cargo.toml
+++ b/crates/jrsonnet-evaluator/Cargo.toml
@@ -4,7 +4,7 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
+edition = "2021"
[features]
default = ["serialized-stdlib", "explaining-traces"]
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth1use crate::function::StaticBuiltin;2use crate::typed::{Any, PositiveF64, VecVal, M1};3use crate::{4 builtin::manifest::{manifest_yaml_ex, ManifestYamlOptions},5 equals,6 error::{Error::*, Result},7 operator::evaluate_mod_op,8 primitive_equals, push_frame, throw,9 typed::{Either2, Either4},10 with_state, ArrValue, Context, FuncVal, IndexableVal, Val,11};12use crate::{Either, ObjValue};13use format::{format_arr, format_obj};14use jrsonnet_interner::IStr;15use jrsonnet_parser::ExprLocation;16use serde::Deserialize;17use serde_yaml::DeserializingQuirks;18use std::collections::HashMap;19use std::convert::{TryFrom, TryInto};2021pub mod stdlib;22pub use stdlib::*;2324use self::manifest::{escape_string_json, manifest_json_ex, ManifestJsonOptions, ManifestType};2526pub mod format;27pub mod manifest;28pub mod sort;2930pub fn std_format(str: IStr, vals: Val) -> Result<String> {31 push_frame(32 None,33 || format!("std.format of {}", str),34 || {35 Ok(match vals {36 Val::Arr(vals) => format_arr(&str, &vals.evaluated()?)?,37 Val::Obj(obj) => format_obj(&str, &obj)?,38 o => format_arr(&str, &[o])?,39 })40 },41 )42}4344pub fn std_slice(45 indexable: IndexableVal,46 index: Option<usize>,47 end: Option<usize>,48 step: Option<usize>,49) -> Result<Val> {50 let index = index.unwrap_or(0);51 let end = end.unwrap_or_else(|| match &indexable {52 IndexableVal::Str(_) => usize::MAX,53 IndexableVal::Arr(v) => v.len(),54 });55 let step = step.unwrap_or(1);56 match &indexable {57 IndexableVal::Str(s) => Ok(Val::Str(58 (s.chars()59 .skip(index)60 .take(end - index)61 .step_by(step)62 .collect::<String>())63 .into(),64 )),65 IndexableVal::Arr(arr) => Ok(Val::Arr(66 (arr.iter()67 .skip(index)68 .take(end - index)69 .step_by(step)70 .collect::<Result<Vec<Val>>>()?)71 .into(),72 )),73 }74}7576type BuiltinsType = HashMap<IStr, &'static dyn StaticBuiltin>;7778thread_local! {79 pub static BUILTINS: BuiltinsType = {80 [81 ("length".into(), builtin_length::INST),82 ("type".into(), builtin_type::INST),83 ("makeArray".into(), builtin_make_array::INST),84 ("codepoint".into(), builtin_codepoint::INST),85 ("objectFieldsEx".into(), builtin_object_fields_ex::INST),86 ("objectHasEx".into(), builtin_object_has_ex::INST),87 ("slice".into(), builtin_slice::INST),88 ("substr".into(), builtin_substr::INST),89 ("primitiveEquals".into(), builtin_primitive_equals::INST),90 ("equals".into(), builtin_equals::INST),91 ("modulo".into(), builtin_modulo::INST),92 ("mod".into(), builtin_mod::INST),93 ("floor".into(), builtin_floor::INST),94 ("ceil".into(), builtin_ceil::INST),95 ("log".into(), builtin_log::INST),96 ("pow".into(), builtin_pow::INST),97 ("sqrt".into(), builtin_sqrt::INST),98 ("sin".into(), builtin_sin::INST),99 ("cos".into(), builtin_cos::INST),100 ("tan".into(), builtin_tan::INST),101 ("asin".into(), builtin_asin::INST),102 ("acos".into(), builtin_acos::INST),103 ("atan".into(), builtin_atan::INST),104 ("exp".into(), builtin_exp::INST),105 ("mantissa".into(), builtin_mantissa::INST),106 ("exponent".into(), builtin_exponent::INST),107 ("extVar".into(), builtin_ext_var::INST),108 ("native".into(), builtin_native::INST),109 ("filter".into(), builtin_filter::INST),110 ("map".into(), builtin_map::INST),111 ("flatMap".into(), builtin_flatmap::INST),112 ("foldl".into(), builtin_foldl::INST),113 ("foldr".into(), builtin_foldr::INST),114 ("sort".into(), builtin_sort::INST),115 ("format".into(), builtin_format::INST),116 ("range".into(), builtin_range::INST),117 ("char".into(), builtin_char::INST),118 ("encodeUTF8".into(), builtin_encode_utf8::INST),119 ("decodeUTF8".into(), builtin_decode_utf8::INST),120 ("md5".into(), builtin_md5::INST),121 ("base64".into(), builtin_base64::INST),122 ("base64DecodeBytes".into(), builtin_base64_decode_bytes::INST),123 ("base64Decode".into(), builtin_base64_decode::INST),124 ("trace".into(), builtin_trace::INST),125 ("join".into(), builtin_join::INST),126 ("escapeStringJson".into(), builtin_escape_string_json::INST),127 ("manifestJsonEx".into(), builtin_manifest_json_ex::INST),128 ("manifestYamlDoc".into(), builtin_manifest_yaml_doc::INST),129 ("reverse".into(), builtin_reverse::INST),130 ("id".into(), builtin_id::INST),131 ("strReplace".into(), builtin_str_replace::INST),132 ("splitLimit".into(), builtin_splitlimit::INST),133 ("parseJson".into(), builtin_parse_json::INST),134 ("parseYaml".into(), builtin_parse_yaml::INST),135 ("asciiUpper".into(), builtin_ascii_upper::INST),136 ("asciiLower".into(), builtin_ascii_lower::INST),137 ("member".into(), builtin_member::INST),138 ("count".into(), builtin_count::INST),139 ].iter().cloned().collect()140 };141}142143#[jrsonnet_macros::builtin]144fn builtin_length(x: Either![IStr, VecVal, ObjValue, FuncVal]) -> Result<usize> {145 use Either4::*;146 Ok(match x {147 A(x) => x.chars().count(),148 B(x) => x.0.len(),149 C(x) => x150 .fields_visibility()151 .into_iter()152 .filter(|(_k, v)| *v)153 .count(),154 D(f) => f.args_len(),155 })156}157158#[jrsonnet_macros::builtin]159fn builtin_type(x: Any) -> Result<IStr> {160 Ok(x.0.value_type().name().into())161}162163#[jrsonnet_macros::builtin]164fn builtin_make_array(sz: usize, func: FuncVal) -> Result<VecVal> {165 let mut out = Vec::with_capacity(sz);166 for i in 0..sz {167 out.push(func.evaluate_simple(&[i as f64].as_slice())?)168 }169 Ok(VecVal(out))170}171172#[jrsonnet_macros::builtin]173const fn builtin_codepoint(str: char) -> Result<u32> {174 Ok(str as u32)175}176177#[jrsonnet_macros::builtin]178fn builtin_object_fields_ex(obj: ObjValue, inc_hidden: bool) -> Result<VecVal> {179 let out = obj.fields_ex(inc_hidden);180 Ok(VecVal(out.into_iter().map(Val::Str).collect::<Vec<_>>()))181}182183#[jrsonnet_macros::builtin]184fn builtin_object_has_ex(obj: ObjValue, f: IStr, inc_hidden: bool) -> Result<bool> {185 Ok(obj.has_field_ex(f, inc_hidden))186}187188#[jrsonnet_macros::builtin]189fn builtin_parse_json(s: IStr) -> Result<Any> {190 let value: serde_json::Value = serde_json::from_str(&s)191 .map_err(|e| RuntimeError(format!("failed to parse json: {}", e).into()))?;192 Ok(Any(Val::try_from(&value)?))193}194195#[jrsonnet_macros::builtin]196fn builtin_parse_yaml(s: IStr) -> Result<Any> {197 let value = serde_yaml::Deserializer::from_str_with_quirks(198 &s,199 DeserializingQuirks { old_octals: true },200 );201 let mut out = vec![];202 for item in value {203 let value = serde_json::Value::deserialize(item)204 .map_err(|e| RuntimeError(format!("failed to parse yaml: {}", e).into()))?;205 let val = Val::try_from(&value)?;206 out.push(val);207 }208 Ok(Any(if out.is_empty() {209 Val::Null210 } else if out.len() == 1 {211 out.into_iter().next().unwrap()212 } else {213 Val::Arr(out.into())214 }))215}216217#[jrsonnet_macros::builtin]218fn builtin_slice(219 indexable: IndexableVal,220 index: Option<usize>,221 end: Option<usize>,222 step: Option<usize>,223) -> Result<Any> {224 std_slice(indexable, index, end, step).map(Any)225}226227#[jrsonnet_macros::builtin]228fn builtin_substr(str: IStr, from: usize, len: usize) -> Result<String> {229 Ok(str.chars().skip(from as usize).take(len as usize).collect())230}231232#[jrsonnet_macros::builtin]233fn builtin_primitive_equals(a: Any, b: Any) -> Result<bool> {234 primitive_equals(&a.0, &b.0)235}236237#[jrsonnet_macros::builtin]238fn builtin_equals(a: Any, b: Any) -> Result<bool> {239 equals(&a.0, &b.0)240}241242#[jrsonnet_macros::builtin]243fn builtin_modulo(a: f64, b: f64) -> Result<f64> {244 Ok(a % b)245}246247#[jrsonnet_macros::builtin]248fn builtin_mod(a: Either![f64, IStr], b: Any) -> Result<Any> {249 use Either2::*;250 Ok(Any(evaluate_mod_op(251 &match a {252 A(v) => Val::Num(v),253 B(s) => Val::Str(s),254 },255 &b.0,256 )?))257}258259#[jrsonnet_macros::builtin]260fn builtin_floor(x: f64) -> Result<f64> {261 Ok(x.floor())262}263264#[jrsonnet_macros::builtin]265fn builtin_ceil(x: f64) -> Result<f64> {266 Ok(x.ceil())267}268269#[jrsonnet_macros::builtin]270fn builtin_log(n: f64) -> Result<f64> {271 Ok(n.ln())272}273274#[jrsonnet_macros::builtin]275fn builtin_pow(x: f64, n: f64) -> Result<f64> {276 Ok(x.powf(n))277}278279#[jrsonnet_macros::builtin]280fn builtin_sqrt(x: PositiveF64) -> Result<f64> {281 Ok(x.0.sqrt())282}283284#[jrsonnet_macros::builtin]285fn builtin_sin(x: f64) -> Result<f64> {286 Ok(x.sin())287}288289#[jrsonnet_macros::builtin]290fn builtin_cos(x: f64) -> Result<f64> {291 Ok(x.cos())292}293294#[jrsonnet_macros::builtin]295fn builtin_tan(x: f64) -> Result<f64> {296 Ok(x.tan())297}298299#[jrsonnet_macros::builtin]300fn builtin_asin(x: f64) -> Result<f64> {301 Ok(x.asin())302}303304#[jrsonnet_macros::builtin]305fn builtin_acos(x: f64) -> Result<f64> {306 Ok(x.acos())307}308309#[jrsonnet_macros::builtin]310fn builtin_atan(x: f64) -> Result<f64> {311 Ok(x.atan())312}313314#[jrsonnet_macros::builtin]315fn builtin_exp(x: f64) -> Result<f64> {316 Ok(x.exp())317}318319fn frexp(s: f64) -> (f64, i16) {320 if 0.0 == s {321 (s, 0)322 } else {323 let lg = s.abs().log2();324 let x = (lg - lg.floor() - 1.0).exp2();325 let exp = lg.floor() + 1.0;326 (s.signum() * x, exp as i16)327 }328}329330#[jrsonnet_macros::builtin]331fn builtin_mantissa(x: f64) -> Result<f64> {332 Ok(frexp(x).0)333}334335#[jrsonnet_macros::builtin]336fn builtin_exponent(x: f64) -> Result<i16> {337 Ok(frexp(x).1)338}339340#[jrsonnet_macros::builtin]341fn builtin_ext_var(x: IStr) -> Result<Any> {342 Ok(Any(with_state(|s| s.settings().ext_vars.get(&x).cloned())343 .ok_or(UndefinedExternalVariable(x))?))344}345346#[jrsonnet_macros::builtin]347fn builtin_native(name: IStr) -> Result<FuncVal> {348 Ok(with_state(|s| s.settings().ext_natives.get(&name).cloned())349 .map(|v| FuncVal::Builtin(v.clone()))350 .ok_or(UndefinedExternalFunction(name))?)351}352353#[jrsonnet_macros::builtin]354fn builtin_filter(func: FuncVal, arr: ArrValue) -> Result<ArrValue> {355 arr.filter(|val| bool::try_from(func.evaluate_simple(&[Any(val.clone())].as_slice())?))356}357358#[jrsonnet_macros::builtin]359fn builtin_map(func: FuncVal, arr: ArrValue) -> Result<ArrValue> {360 arr.map(|val| func.evaluate_simple(&[Any(val)].as_slice()))361}362363#[jrsonnet_macros::builtin]364fn builtin_flatmap(func: FuncVal, arr: IndexableVal) -> Result<IndexableVal> {365 match arr {366 IndexableVal::Str(s) => {367 let mut out = String::new();368 for c in s.chars() {369 match func.evaluate_simple(&[c.to_string()].as_slice())? {370 Val::Str(o) => out.push_str(&o),371 _ => throw!(RuntimeError(372 "in std.join all items should be strings".into()373 )),374 };375 }376 Ok(IndexableVal::Str(out.into()))377 }378 IndexableVal::Arr(a) => {379 let mut out = Vec::new();380 for el in a.iter() {381 let el = el?;382 match func.evaluate_simple(&[Any(el)].as_slice())? {383 Val::Arr(o) => {384 for oe in o.iter() {385 out.push(oe?)386 }387 }388 _ => throw!(RuntimeError(389 "in std.join all items should be arrays".into()390 )),391 };392 }393 Ok(IndexableVal::Arr(out.into()))394 }395 }396}397398#[jrsonnet_macros::builtin]399fn builtin_foldl(func: FuncVal, arr: ArrValue, init: Any) -> Result<Any> {400 let mut acc = init.0;401 for i in arr.iter() {402 acc = func.evaluate_simple(&[Any(acc), Any(i?)].as_slice())?;403 }404 Ok(Any(acc))405}406407#[jrsonnet_macros::builtin]408fn builtin_foldr(func: FuncVal, arr: ArrValue, init: Any) -> Result<Any> {409 let mut acc = init.0;410 for i in arr.iter().rev() {411 acc = func.evaluate_simple(&[Any(i?), Any(acc)].as_slice())?;412 }413 Ok(Any(acc))414}415416#[jrsonnet_macros::builtin]417#[allow(non_snake_case)]418fn builtin_sort(arr: ArrValue, keyF: Option<FuncVal>) -> Result<ArrValue> {419 if arr.len() <= 1 {420 return Ok(arr);421 }422 Ok(ArrValue::Eager(sort::sort(423 arr.evaluated()?,424 keyF.as_ref(),425 )?))426}427428#[jrsonnet_macros::builtin]429fn builtin_format(str: IStr, vals: Any) -> Result<String> {430 std_format(str, vals.0)431}432433#[jrsonnet_macros::builtin]434fn builtin_range(from: i32, to: i32) -> Result<VecVal> {435 if to < from {436 return Ok(VecVal(Vec::new()));437 }438 let mut out = Vec::with_capacity((1 + to as usize - from as usize).max(0));439 for i in from as usize..=to as usize {440 out.push(Val::Num(i as f64));441 }442 Ok(VecVal(out))443}444445#[jrsonnet_macros::builtin]446fn builtin_char(n: u32) -> Result<char> {447 Ok(std::char::from_u32(n as u32).ok_or(InvalidUnicodeCodepointGot(n as u32))?)448}449450#[jrsonnet_macros::builtin]451fn builtin_encode_utf8(str: IStr) -> Result<VecVal> {452 Ok(VecVal(453 str.bytes()454 .map(|b| Val::Num(b as f64))455 .collect::<Vec<Val>>(),456 ))457}458459#[jrsonnet_macros::builtin]460fn builtin_decode_utf8(arr: Vec<u8>) -> Result<String> {461 Ok(String::from_utf8(arr).map_err(|_| RuntimeError("bad utf8".into()))?)462}463464#[jrsonnet_macros::builtin]465fn builtin_md5(str: IStr) -> Result<String> {466 Ok(format!("{:x}", md5::compute(&str.as_bytes())))467}468469#[jrsonnet_macros::builtin]470fn builtin_trace(#[location] loc: Option<&ExprLocation>, str: IStr, rest: Any) -> Result<Any> {471 eprint!("TRACE:");472 if let Some(loc) = loc {473 with_state(|s| {474 let locs = s.map_source_locations(&loc.0, &[loc.1]);475 eprint!(476 " {}:{}",477 loc.0.file_name().unwrap().to_str().unwrap(),478 locs[0].line479 );480 });481 }482 eprintln!(" {}", str);483 Ok(rest) as Result<Any>484}485486#[jrsonnet_macros::builtin]487fn builtin_base64(input: Either![Vec<u8>, IStr]) -> Result<String> {488 use Either2::*;489 Ok(match input {490 A(a) => base64::encode(a),491 B(l) => base64::encode(l.bytes().collect::<Vec<_>>()),492 })493}494495#[jrsonnet_macros::builtin]496fn builtin_base64_decode_bytes(input: IStr) -> Result<Vec<u8>> {497 Ok(base64::decode(&input.as_bytes()).map_err(|_| RuntimeError("bad base64".into()))?)498}499500#[jrsonnet_macros::builtin]501fn builtin_base64_decode(input: IStr) -> Result<String> {502 let bytes = base64::decode(&input.as_bytes()).map_err(|_| RuntimeError("bad base64".into()))?;503 Ok(String::from_utf8(bytes).map_err(|_| RuntimeError("bad utf8".into()))?)504}505506#[jrsonnet_macros::builtin]507fn builtin_join(sep: IndexableVal, arr: ArrValue) -> Result<IndexableVal> {508 Ok(match sep {509 IndexableVal::Arr(joiner_items) => {510 let mut out = Vec::new();511512 let mut first = true;513 for item in arr.iter() {514 let item = item?.clone();515 if let Val::Arr(items) = item {516 if !first {517 out.reserve(joiner_items.len());518 // TODO: extend519 for item in joiner_items.iter() {520 out.push(item?);521 }522 }523 first = false;524 out.reserve(items.len());525 // TODO: extend526 for item in items.iter() {527 out.push(item?);528 }529 } else {530 throw!(RuntimeError(531 "in std.join all items should be arrays".into()532 ));533 }534 }535536 IndexableVal::Arr(out.into())537 }538 IndexableVal::Str(sep) => {539 let mut out = String::new();540541 let mut first = true;542 for item in arr.iter() {543 let item = item?.clone();544 if let Val::Str(item) = item {545 if !first {546 out += &sep;547 }548 first = false;549 out += &item;550 } else {551 throw!(RuntimeError(552 "in std.join all items should be strings".into()553 ));554 }555 }556557 IndexableVal::Str(out.into())558 }559 })560}561562#[jrsonnet_macros::builtin]563fn builtin_escape_string_json(str_: IStr) -> Result<String> {564 Ok(escape_string_json(&str_))565}566567#[jrsonnet_macros::builtin]568fn builtin_manifest_json_ex(569 value: Any,570 indent: IStr,571 newline: Option<IStr>,572 key_val_sep: Option<IStr>,573) -> Result<String> {574 let newline = newline.as_deref().unwrap_or("\n");575 let key_val_sep = key_val_sep.as_deref().unwrap_or(": ");576 manifest_json_ex(577 &value.0,578 &ManifestJsonOptions {579 padding: &indent,580 mtype: ManifestType::Std,581 newline,582 key_val_sep,583 },584 )585}586587#[jrsonnet_macros::builtin]588fn builtin_manifest_yaml_doc(589 value: Any,590 indent_array_in_object: Option<bool>,591 quote_keys: Option<bool>,592) -> Result<String> {593 manifest_yaml_ex(594 &value.0,595 &ManifestYamlOptions {596 padding: " ",597 arr_element_padding: if indent_array_in_object.unwrap_or(false) {598 " "599 } else {600 ""601 },602 quote_keys: quote_keys.unwrap_or(true),603 },604 )605}606607#[jrsonnet_macros::builtin]608fn builtin_reverse(value: ArrValue) -> Result<ArrValue> {609 Ok(value.reversed())610}611612#[jrsonnet_macros::builtin]613const fn builtin_id(v: Any) -> Result<Any> {614 Ok(v)615}616617#[jrsonnet_macros::builtin]618fn builtin_str_replace(str: String, from: IStr, to: IStr) -> Result<String> {619 Ok(str.replace(&from as &str, &to as &str))620}621622#[jrsonnet_macros::builtin]623fn builtin_splitlimit(str: IStr, c: char, maxsplits: Either![usize, M1]) -> Result<VecVal> {624 use Either2::*;625 Ok(VecVal(match maxsplits {626 A(n) => str.splitn(n + 1, c).map(|s| Val::Str(s.into())).collect(),627 B(_) => str.split(c).map(|s| Val::Str(s.into())).collect(),628 }))629}630631#[jrsonnet_macros::builtin]632fn builtin_ascii_upper(str: IStr) -> Result<String> {633 Ok(str.to_ascii_uppercase())634}635636#[jrsonnet_macros::builtin]637fn builtin_ascii_lower(str: IStr) -> Result<String> {638 Ok(str.to_ascii_lowercase())639}640641#[jrsonnet_macros::builtin]642fn builtin_member(arr: IndexableVal, x: Any) -> Result<bool> {643 match arr {644 IndexableVal::Str(s) => {645 let x: IStr = IStr::try_from(x.0)?;646 Ok(!x.is_empty() && s.contains(&*x))647 }648 IndexableVal::Arr(a) => {649 for item in a.iter() {650 let item = item?;651 if equals(&item, &x.0)? {652 return Ok(true);653 }654 }655 Ok(false)656 }657 }658}659660#[jrsonnet_macros::builtin]661fn builtin_count(arr: Vec<Any>, v: Any) -> Result<usize> {662 let mut count = 0;663 for item in arr.iter() {664 if equals(&item.0, &v.0)? {665 count += 1;666 }667 }668 Ok(count)669}crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/lib.rs
+++ b/crates/jrsonnet-evaluator/src/lib.rs
@@ -23,6 +23,8 @@
pub mod typed;
mod val;
+pub use jrsonnet_parser as parser;
+
pub use ctx::*;
pub use dynamic::*;
use error::{Error::*, LocError, Result, StackTraceElement};
@@ -175,7 +177,7 @@
pub(crate) fn with_state<T>(f: impl FnOnce(&EvaluationState) -> T) -> T {
EVAL_STATE.with(|s| f(s.borrow().as_ref().unwrap()))
}
-pub(crate) fn push_frame<T>(
+pub fn push_frame<T>(
e: Option<&ExprLocation>,
frame_desc: impl FnOnce() -> String,
f: impl FnOnce() -> Result<T>,
@@ -184,7 +186,7 @@
}
#[allow(dead_code)]
-pub(crate) fn push_val_frame(
+pub fn push_val_frame(
e: &ExprLocation,
frame_desc: impl FnOnce() -> String,
f: impl FnOnce() -> Result<Val>,
@@ -192,7 +194,7 @@
with_state(|s| s.push_val(e, frame_desc, f))
}
#[allow(dead_code)]
-pub(crate) fn push_description_frame<T>(
+pub fn push_description_frame<T>(
frame_desc: impl FnOnce() -> String,
f: impl FnOnce() -> Result<T>,
) -> Result<T> {
crates/jrsonnet-evaluator/src/typed/mod.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/typed/mod.rs
+++ b/crates/jrsonnet-evaluator/src/typed/mod.rs
@@ -13,9 +13,9 @@
#[macro_export]
macro_rules! unwrap_type {
- ($desc: expr, $value: expr, $typ: expr => $match: path) => {{
- use $crate::{push_stack_frame, typed::CheckType};
- push_stack_frame(None, $desc, || Ok($typ.check(&$value)?))?;
+ ($desc:expr, $value:expr, $typ:expr => $match:path) => {{
+ use $crate::{push_frame, typed::CheckType};
+ push_frame(None, $desc, || Ok($typ.check(&$value)?))?;
match $value {
$match(v) => v,
_ => unreachable!(),
crates/jrsonnet-interner/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-interner/Cargo.toml
+++ b/crates/jrsonnet-interner/Cargo.toml
@@ -4,7 +4,7 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
+edition = "2021"
[dependencies]
serde = { version = "1.0" }
crates/jrsonnet-macros/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-macros/src/lib.rs
+++ b/crates/jrsonnet-macros/src/lib.rs
@@ -136,7 +136,11 @@
#[derive(Clone, Copy, gcmodule::Trace)]
#vis struct #name {}
const _: () = {
- use ::jrsonnet_evaluator::function::{Builtin, StaticBuiltin, BuiltinParam, ArgsLike};
+ use ::jrsonnet_evaluator::{
+ function::{Builtin, StaticBuiltin, BuiltinParam, ArgsLike, parse_builtin_call},
+ error::Result, Context,
+ parser::ExprLocation,
+ };
const PARAMS: &'static [BuiltinParam] = &[
#(#params),*
];
@@ -156,7 +160,7 @@
PARAMS
}
fn call(&self, context: Context, loc: Option<&ExprLocation>, args: &dyn ArgsLike) -> Result<Val> {
- let parsed = ::jrsonnet_evaluator::function::parse_builtin_call(context, &PARAMS, args, false)?;
+ let parsed = parse_builtin_call(context, &PARAMS, args, false)?;
let result: #result = #name(#(#args),*);
let result = result?;
crates/jrsonnet-parser/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-parser/Cargo.toml
+++ b/crates/jrsonnet-parser/Cargo.toml
@@ -4,7 +4,7 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
+edition = "2021"
[features]
default = []
@@ -14,7 +14,7 @@
[dependencies]
jrsonnet-interner = { path = "../jrsonnet-interner", version = "0.4.2" }
-peg = "0.7.0"
+peg = "0.8.0"
serde = { version = "1.0", features = ["derive", "rc"], optional = true }
gcmodule = { git = "https://github.com/CertainLach/gcmodule", branch = "jrsonnet" }
crates/jrsonnet-parser/src/lib.rsdiffbeforeafterboth--- a/crates/jrsonnet-parser/src/lib.rs
+++ b/crates/jrsonnet-parser/src/lib.rs
@@ -114,8 +114,8 @@
/ "\\x" hex_char() hex_char()
/ ['\\'] (quiet! { ['b' | 'f' | 'n' | 'r' | 't'] / c() } / expected!("<escape character>"))
pub rule string() -> String
- = ['"'] str:$(string_char(<['"']>)*) ['"'] {? unescape::unescape(str).ok_or("<escaped string>")}
- / ['\''] str:$(string_char(<['\'']>)*) ['\''] {? unescape::unescape(str).ok_or("<escaped string>")}
+ = ['"'] str:$(string_char(<"\"">)*) ['"'] {? unescape::unescape(str).ok_or("<escaped string>")}
+ / ['\''] str:$(string_char(<"\'">)*) ['\''] {? unescape::unescape(str).ok_or("<escaped string>")}
/ quiet!{ "@'" str:$(("''" / (!['\''][_]))*) "'" {str.replace("''", "'")}
/ "@\"" str:$(("\"\"" / (!['"'][_]))*) "\"" {str.replace("\"\"", "\"")}
/ string_block() } / expected!("<string>")
crates/jrsonnet-stdlib/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-stdlib/Cargo.toml
+++ b/crates/jrsonnet-stdlib/Cargo.toml
@@ -4,7 +4,7 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
+edition = "2021"
[features]
crates/jrsonnet-types/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-types/Cargo.toml
+++ b/crates/jrsonnet-types/Cargo.toml
@@ -4,8 +4,8 @@
version = "0.4.2"
authors = ["Yaroslav Bolyukin <iam@lach.pw>"]
license = "MIT"
-edition = "2018"
+edition = "2021"
[dependencies]
-peg = "0.7.0"
+peg = "0.8.0"
gcmodule = { git = "https://github.com/CertainLach/gcmodule", branch = "jrsonnet" }