1
0
Fork 0
mirror of https://github.com/imjasonh/krust synced 2026-07-08 06:45:32 +00:00

migrate to rust-yaml2

Signed-off-by: Jason Hall <jason@chainguard.dev>
This commit is contained in:
Jason Hall 2025-10-15 15:16:35 -04:00
parent bcdf3896e3
commit 5eab01622e
2 changed files with 21 additions and 20 deletions

View file

@ -21,7 +21,7 @@ tar = "0.4"
flate2 = "1.0" flate2 = "1.0"
reqwest = { version = "0.12", features = ["json", "stream"] } reqwest = { version = "0.12", features = ["json", "stream"] }
bytes = "1.0" bytes = "1.0"
serde_yml = "0.0.12" yaml-rust2 = "0.10"
tracing = "0.1" tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] }
dirs = "6.0" dirs = "6.0"

View file

@ -1,7 +1,7 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use serde::Deserialize;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::path::Path; use std::path::Path;
use yaml_rust2::{Yaml, YamlEmitter, YamlLoader};
const KRUST_PREFIX: &str = "krust://"; const KRUST_PREFIX: &str = "krust://";
@ -10,28 +10,29 @@ pub fn find_krust_references(yaml_content: &str) -> Result<HashSet<String>> {
let mut references = HashSet::new(); let mut references = HashSet::new();
// Parse YAML documents (handle multiple --- separated docs) // Parse YAML documents (handle multiple --- separated docs)
for doc in serde_yml::Deserializer::from_str(yaml_content) { let docs = YamlLoader::load_from_str(yaml_content)?;
let value = serde_yml::Value::deserialize(doc)?;
find_references_in_value(&value, &mut references); for doc in &docs {
find_references_in_value(doc, &mut references);
} }
Ok(references) Ok(references)
} }
/// Recursively search for krust:// references in a YAML value /// Recursively search for krust:// references in a YAML value
fn find_references_in_value(value: &serde_yml::Value, references: &mut HashSet<String>) { fn find_references_in_value(value: &Yaml, references: &mut HashSet<String>) {
match value { match value {
serde_yml::Value::String(s) => { Yaml::String(s) => {
if let Some(path) = s.strip_prefix(KRUST_PREFIX) { if let Some(path) = s.strip_prefix(KRUST_PREFIX) {
references.insert(path.to_string()); references.insert(path.to_string());
} }
} }
serde_yml::Value::Sequence(seq) => { Yaml::Array(seq) => {
for item in seq { for item in seq {
find_references_in_value(item, references); find_references_in_value(item, references);
} }
} }
serde_yml::Value::Mapping(map) => { Yaml::Hash(map) => {
for (_key, val) in map { for (_key, val) in map {
find_references_in_value(val, references); find_references_in_value(val, references);
} }
@ -48,42 +49,42 @@ pub fn replace_krust_references(
let mut result = Vec::new(); let mut result = Vec::new();
// Parse and process each YAML document // Parse and process each YAML document
let docs: Vec<serde_yml::Value> = serde_yml::Deserializer::from_str(yaml_content) let mut docs = YamlLoader::load_from_str(yaml_content)?;
.map(serde_yml::Value::deserialize)
.collect::<Result<Vec<_>, _>>()?;
for (i, mut value) in docs.into_iter().enumerate() { for (i, doc) in docs.iter_mut().enumerate() {
replace_in_value(&mut value, replacements); replace_in_value(doc, replacements);
// Serialize back to YAML // Serialize back to YAML
let yaml_str = serde_yml::to_string(&value)?; let mut out_str = String::new();
let mut emitter = YamlEmitter::new(&mut out_str);
emitter.dump(doc)?;
// Add document separator if not the first document // Add document separator if not the first document
if i > 0 { if i > 0 {
result.push("---\n".to_string()); result.push("---\n".to_string());
} }
result.push(yaml_str); result.push(out_str);
} }
Ok(result.join("")) Ok(result.join(""))
} }
/// Recursively replace krust:// references in a YAML value /// Recursively replace krust:// references in a YAML value
fn replace_in_value(value: &mut serde_yml::Value, replacements: &HashMap<String, String>) { fn replace_in_value(value: &mut Yaml, replacements: &HashMap<String, String>) {
match value { match value {
serde_yml::Value::String(s) => { Yaml::String(s) => {
if let Some(path) = s.strip_prefix(KRUST_PREFIX) { if let Some(path) = s.strip_prefix(KRUST_PREFIX) {
if let Some(replacement) = replacements.get(path) { if let Some(replacement) = replacements.get(path) {
*s = replacement.clone(); *s = replacement.clone();
} }
} }
} }
serde_yml::Value::Sequence(seq) => { Yaml::Array(seq) => {
for item in seq { for item in seq {
replace_in_value(item, replacements); replace_in_value(item, replacements);
} }
} }
serde_yml::Value::Mapping(map) => { Yaml::Hash(map) => {
for (_key, val) in map { for (_key, val) in map {
replace_in_value(val, replacements); replace_in_value(val, replacements);
} }