difftreelog
Merge pull request #124 from pawelbeza/missing-std-features
in: master
10 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -375,7 +375,9 @@
"serde",
"serde_json",
"serde_yaml_with_quirks",
+ "sha1",
"sha2",
+ "sha3",
"structdump",
]
@@ -388,6 +390,15 @@
]
[[package]]
+name = "keccak"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940"
+dependencies = [
+ "cpufeatures",
+]
+
+[[package]]
name = "libc"
version = "0.2.139"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -676,6 +687,17 @@
]
[[package]]
+name = "sha1"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
name = "sha2"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -687,6 +709,16 @@
]
[[package]]
+name = "sha3"
+version = "0.10.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60"
+dependencies = [
+ "digest",
+ "keccak",
+]
+
+[[package]]
name = "smallvec"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
crates/jrsonnet-stdlib/Cargo.tomldiffbeforeafterboth--- a/crates/jrsonnet-stdlib/Cargo.toml
+++ b/crates/jrsonnet-stdlib/Cargo.toml
@@ -32,8 +32,12 @@
# std.md5
md5 = "0.7.0"
+# std.sha1
+sha1 = "0.10.5"
# std.sha256, std.sha512
sha2 = "0.10.6"
+# std.sha3
+sha3 = "0.10.8"
# std.base64
base64 = "0.21.0"
# std.parseJson
crates/jrsonnet-stdlib/src/arrays.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/arrays.rs
+++ b/crates/jrsonnet-stdlib/src/arrays.rs
@@ -253,3 +253,26 @@
}
Ok(Val::Num(arr.iter().sum::<f64>() / (arr.len() as f64)))
}
+
+#[builtin]
+pub fn builtin_remove_at(
+ arr: ArrValue,
+ index: usize,
+) -> Result<ArrValue> {
+ let newArrLeft = arr.clone().slice(None, Some(index), None);
+ let newArrRight = arr.clone().slice(Some(index + 1), None, None);
+ return Ok(ArrValue::extended(
+ newArrLeft.unwrap_or(ArrValue::empty()),
+ newArrRight.unwrap_or(ArrValue::empty()))
+ );
+}
+
+#[builtin]
+pub fn builtin_remove(arr: ArrValue, elem: Val) -> Result<ArrValue> {
+ for (index, item) in arr.iter().enumerate() {
+ if equals(&item?, &elem)? {
+ return builtin_remove_at(arr.clone(), index)
+ }
+ }
+ Ok(arr)
+}
crates/jrsonnet-stdlib/src/hash.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/hash.rs
+++ b/crates/jrsonnet-stdlib/src/hash.rs
@@ -16,3 +16,15 @@
use sha2::digest::Digest;
format!("{:x}", sha2::Sha512::digest(s.as_bytes()))
}
+
+#[builtin]
+pub fn builtin_sha1(s: IStr) -> String {
+ use sha1::digest::Digest;
+ format!("{:x}", sha1::Sha1::digest(s.as_bytes()))
+}
+
+#[builtin]
+pub fn builtin_sha3(s: IStr) -> String {
+ use sha3::digest::Digest;
+ format!("{:x}", sha3::Sha3_512::digest(s.as_bytes()))
+}
crates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth83 ("contains", builtin_member::INST),83 ("contains", builtin_member::INST),84 ("count", builtin_count::INST),84 ("count", builtin_count::INST),85 ("avg", builtin_avg::INST),85 ("avg", builtin_avg::INST),86 ("removeAt", builtin_remove_at::INST),87 ("remove", builtin_remove::INST),86 // Math88 // Math87 ("abs", builtin_abs::INST),89 ("abs", builtin_abs::INST),88 ("sign", builtin_sign::INST),90 ("sign", builtin_sign::INST),104 ("exp", builtin_exp::INST),106 ("exp", builtin_exp::INST),105 ("mantissa", builtin_mantissa::INST),107 ("mantissa", builtin_mantissa::INST),106 ("exponent", builtin_exponent::INST),108 ("exponent", builtin_exponent::INST),109 ("round", builtin_round::INST),110 ("isEven", builtin_is_even::INST),111 ("isOdd", builtin_is_odd::INST),112 ("isInteger", builtin_is_integer::INST),113 ("isDecimal", builtin_is_decimal::INST),107 // Operator114 // Operator108 ("mod", builtin_mod::INST),115 ("mod", builtin_mod::INST),109 ("primitiveEquals", builtin_primitive_equals::INST),116 ("primitiveEquals", builtin_primitive_equals::INST),110 ("equals", builtin_equals::INST),117 ("equals", builtin_equals::INST),111 ("xor", builtin_xor::INST),118 ("xor", builtin_xor::INST),119 ("xnor", builtin_xnor::INST),112 ("format", builtin_format::INST),120 ("format", builtin_format::INST),113 // Sort121 // Sort114 ("sort", builtin_sort::INST),122 ("sort", builtin_sort::INST),118 ("maxArray", builtin_max_array::INST),126 ("maxArray", builtin_max_array::INST),119 // Hash127 // Hash120 ("md5", builtin_md5::INST),128 ("md5", builtin_md5::INST),129 ("sha1", builtin_sha1::INST),121 ("sha256", builtin_sha256::INST),130 ("sha256", builtin_sha256::INST),122 ("sha512", builtin_sha512::INST),131 ("sha512", builtin_sha512::INST),132 ("sha3", builtin_sha3::INST),123 // Encoding133 // Encoding124 ("encodeUTF8", builtin_encode_utf8::INST),134 ("encodeUTF8", builtin_encode_utf8::INST),125 ("decodeUTF8", builtin_decode_utf8::INST),135 ("decodeUTF8", builtin_decode_utf8::INST),129 // Objects139 // Objects130 ("objectFieldsEx", builtin_object_fields_ex::INST),140 ("objectFieldsEx", builtin_object_fields_ex::INST),131 ("objectHasEx", builtin_object_has_ex::INST),141 ("objectHasEx", builtin_object_has_ex::INST),142 ("objectRemoveKey", builtin_object_remove_key::INST),132 // Manifest143 // Manifest133 ("escapeStringJson", builtin_escape_string_json::INST),144 ("escapeStringJson", builtin_escape_string_json::INST),134 ("manifestJsonEx", builtin_manifest_json_ex::INST),145 ("manifestJsonEx", builtin_manifest_json_ex::INST),142 ("substr", builtin_substr::INST),153 ("substr", builtin_substr::INST),143 ("char", builtin_char::INST),154 ("char", builtin_char::INST),144 ("strReplace", builtin_str_replace::INST),155 ("strReplace", builtin_str_replace::INST),156 ("isEmpty", builtin_is_empty::INST),157 ("equalsIgnoreCase", builtin_equals_ignore_case::INST),145 ("splitLimit", builtin_splitlimit::INST),158 ("splitLimit", builtin_splitlimit::INST),146 ("asciiUpper", builtin_ascii_upper::INST),159 ("asciiUpper", builtin_ascii_upper::INST),147 ("asciiLower", builtin_ascii_lower::INST),160 ("asciiLower", builtin_ascii_lower::INST),crates/jrsonnet-stdlib/src/math.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/math.rs
+++ b/crates/jrsonnet-stdlib/src/math.rs
@@ -114,3 +114,28 @@
pub fn builtin_exponent(x: f64) -> i16 {
frexp(x).1
}
+
+#[builtin]
+pub fn builtin_round(x: f64) -> f64 {
+ x.round()
+}
+
+#[builtin]
+pub fn builtin_is_even(x: f64) -> bool {
+ builtin_round(x) % 2.0 == 0.0
+}
+
+#[builtin]
+pub fn builtin_is_odd(x: f64) -> bool {
+ builtin_round(x) % 2.0 == 1.0
+}
+
+#[builtin]
+pub fn builtin_is_integer(x: f64) -> bool {
+ builtin_round(x) == x
+}
+
+#[builtin]
+pub fn builtin_is_decimal(x: f64) -> bool {
+ builtin_round(x) != x
+}
crates/jrsonnet-stdlib/src/objects.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/objects.rs
+++ b/crates/jrsonnet-stdlib/src/objects.rs
@@ -1,9 +1,10 @@
use jrsonnet_evaluator::{
function::builtin,
val::{StrValue, Val},
- IStr, ObjValue,
+ IStr, ObjValue, ObjValueBuilder,
};
+
#[builtin]
pub fn builtin_object_fields_ex(
obj: ObjValue,
@@ -27,3 +28,16 @@
pub fn builtin_object_has_ex(obj: ObjValue, fname: IStr, hidden: bool) -> bool {
obj.has_field_ex(fname, hidden)
}
+
+#[builtin]
+pub fn builtin_object_remove_key(obj: ObjValue, key: IStr) -> ObjValue {
+ let mut new_obj = ObjValueBuilder::with_capacity(obj.len() - 1);
+ for (k, v) in obj.iter() {
+ if k == key {
+ continue
+ }
+ new_obj.member(k).value_unchecked(v.unwrap())
+ }
+
+ new_obj.build()
+}
crates/jrsonnet-stdlib/src/operator.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/operator.rs
+++ b/crates/jrsonnet-stdlib/src/operator.rs
@@ -39,6 +39,11 @@
}
#[builtin]
+pub fn builtin_xnor(x: bool, y: bool) -> bool {
+ x == y
+}
+
+#[builtin]
pub fn builtin_format(str: IStr, vals: Val) -> Result<String> {
std_format(&str, vals)
}
crates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -274,6 +274,12 @@
objectValuesAll(o)::
[o[k] for k in std.objectFieldsAll(o)],
+ objectKeysValues(o)::
+ [{ key: k, value: o[k] } for k in std.objectFields(o)],
+
+ objectKeysValuesAll(o)::
+ [{ key: k, value: o[k] } for k in std.objectFieldsAll(o)],
+
resolvePath(f, r)::
local arr = std.split(f, '/');
std.join('/', std.makeArray(std.length(arr) - 1, function(i) arr[i]) + [r]),
crates/jrsonnet-stdlib/src/strings.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/strings.rs
+++ b/crates/jrsonnet-stdlib/src/strings.rs
@@ -28,6 +28,16 @@
}
#[builtin]
+pub fn builtin_is_empty(str: String) -> bool {
+ str.is_empty()
+}
+
+#[builtin]
+pub fn builtin_equals_ignore_case(x: String, y: String) -> bool {
+ x.to_ascii_lowercase() == y.to_ascii_lowercase()
+}
+
+#[builtin]
pub fn builtin_splitlimit(str: IStr, c: IStr, maxsplits: Either![usize, M1]) -> ArrValue {
use Either2::*;
match maxsplits {