git.delta.rocks / jrsonnet / refs/commits / c2bc5cc00543

difftreelog

feat apperently, std.sort now supports arrays

Yaroslav Bolyukin2023-05-03parent: #7d0dc29.patch.diff
in: master

1 file changed

modifiedcrates/jrsonnet-stdlib/src/sort.rsdiffbeforeafterboth
1use std::cmp::Ordering;
2
1use jrsonnet_evaluator::{3use jrsonnet_evaluator::{
2 error::Result,4 error::Result,
3 function::{builtin, FuncVal},5 function::{builtin, FuncVal},
6 operator::evaluate_compare_op,
4 throw,7 throw,
5 val::{equals, ArrValue},8 val::{equals, ArrValue},
6 Thunk, Val,9 Thunk, Val,
39 (Val::Str(_) | Val::Num(_), _) => {42 (Val::Str(_) | Val::Num(_), _) => {
40 throw!("sort elements should have the same types")43 throw!("sort elements should have the same types")
41 }44 }
42 _ => throw!("sort key should either be a string or a number"),45 _ => {}
43 }46 }
44 }47 }
45 Ok(sort_type)48 Ok(sort_type)
57 Val::Str(s) => s.clone(),60 Val::Str(s) => s.clone(),
58 _ => unreachable!(),61 _ => unreachable!(),
59 }),62 }),
60 SortKeyType::Unknown => unreachable!("list is not empty, as checked in sort"),63 SortKeyType::Unknown => {
64 let mut err = None;
65 // evaluate_compare_op will never return equal on types, which are different from
66 // jsonnet perspective
67 values.sort_unstable_by(|a, b| {
68 match evaluate_compare_op(a, b, jrsonnet_parser::BinaryOpType::Lt) {
69 Ok(ord) => ord,
70 Err(e) if err.is_none() => {
71 let _ = err.insert(e);
72 Ordering::Equal
73 }
74 Err(_) => Ordering::Equal,
75 }
76 });
77 if let Some(err) = err {
78 return Err(err);
79 }
80 }
61 };81 };
62 Ok(values)82 Ok(values)
63}83}
81 Val::Str(s) => s.clone(),101 Val::Str(s) => s.clone(),
82 _ => unreachable!(),102 _ => unreachable!(),
83 }),103 }),
84 SortKeyType::Unknown => unreachable!("list is not empty, as checked in sort"),104 SortKeyType::Unknown => {
105 let mut err = None;
106 // evaluate_compare_op will never return equal on types, which are different from
107 // jsonnet perspective
108 vk.sort_by(|(_a, ak), (_b, bk)| {
109 match evaluate_compare_op(ak, bk, jrsonnet_parser::BinaryOpType::Lt) {
110 Ok(ord) => ord,
111 Err(e) if err.is_none() => {
112 let _ = err.insert(e);
113 Ordering::Equal
114 }
115 Err(_) => Ordering::Equal,
116 }
117 });
118 if let Some(err) = err {
119 return Err(err);
120 }
121 }
85 };122 };
86 Ok(vk.into_iter().map(|v| v.0).collect())123 Ok(vk.into_iter().map(|v| v.0).collect())
87}124}