¿Es posible ordenar JSON en lenguaje oxidado? Si es posible, ¿cómo?
Como éste:
const headers = { 'checkout-account': '1234', 'checkout-algorithm': 'sha256', 'checkout-method': 'POST', 'checkout-nonce': '564635208570151', 'checkout-timestamp': '2018-07-06T10:01:31.904Z', }; const calculateHmac = (body=false, params) => { const hmacPayload = Object.keys(params) .sort() .map((key) => [key, params[key]].join(':')) .concat(body ? JSON.stringify(body) : '') .join('\n'); }; calculateHmac(false, headers);Más o menos el mismo código en Rust:
use itertools::Itertools; use std::collections::HashMap; fn main() { let headers = HashMap::from([ ("checkout-account", "1234"), ("checkout-algorithm", "sha256"), ("checkout-method", "POST"), ("checkout-nonce", "564635208570151"), ("checkout-timestamp", "2018-07-06T10,01,31.904Z"), ]); let hmac_payload = headers .keys() .sorted() .map(|key| format!("{}:{}", key, headers[key])) .join("\n"); println!("{hmac_payload}"); }Como señaló @cdhowie, Rust le brinda la opción de ordenar los elementos por clave en lugar de ordenar solo las claves y luego realizar una búsqueda cada vez:
let hmac_payload = headers .iter() .sorted_by_key(|item| item.0) .map(|item| format!("{}:{}", item.0, item.1)) .join("\n"); Como señaló @Caesar, usar BTreeMap en lugar de HashMap sería una solución más eficiente, ya que almacena elementos ordenados por sus claves, por lo que no necesitará ordenar elementos en absoluto.