difftreelog
feat apperently, std.sort now supports arrays
in: master
1 file changed
crates/jrsonnet-stdlib/src/sort.rsdiffbeforeafterboth1use std::cmp::Ordering;21use 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 from66 // jsonnet perspective67 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::Equal73 }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 from107 // jsonnet perspective108 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::Equal114 }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}