refactor(tvix/derivation): refactor the derivation serialization
This refactors the code to serialize a derivation. The original code has beed moved to seperate crates for better code structure. Change-Id: I3b1a6b134428fcbc9930c330bced8ec3610cfb4c Reviewed-on: https://cl.tvl.fyi/c/depot/+/7733 Tested-by: BuildkiteCI Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
		
							parent
							
								
									e6862413ca
								
							
						
					
					
						commit
						31973890a9
					
				
					 6 changed files with 248 additions and 215 deletions
				
			
		
							
								
								
									
										174
									
								
								tvix/derivation/src/write.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								tvix/derivation/src/write.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,174 @@
 | 
			
		|||
use crate::output::Output;
 | 
			
		||||
use crate::string_escape::escape_string;
 | 
			
		||||
use std::{collections::BTreeMap, fmt, fmt::Write};
 | 
			
		||||
 | 
			
		||||
pub const DERIVATION_PREFIX: &str = "Derive";
 | 
			
		||||
pub const PAREN_OPEN: char = '(';
 | 
			
		||||
pub const PAREN_CLOSE: char = ')';
 | 
			
		||||
pub const BRACKET_OPEN: char = '[';
 | 
			
		||||
pub const BRACKET_CLOSE: char = ']';
 | 
			
		||||
pub const COMMA: char = ',';
 | 
			
		||||
pub const QUOTE: char = '"';
 | 
			
		||||
 | 
			
		||||
fn write_array_elements(
 | 
			
		||||
    writer: &mut impl Write,
 | 
			
		||||
    quote: bool,
 | 
			
		||||
    open: &str,
 | 
			
		||||
    closing: &str,
 | 
			
		||||
    elements: Vec<&String>,
 | 
			
		||||
) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_str(open)?;
 | 
			
		||||
 | 
			
		||||
    for (index, element) in elements.iter().enumerate() {
 | 
			
		||||
        if index > 0 {
 | 
			
		||||
            writer.write_char(COMMA)?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if quote {
 | 
			
		||||
            writer.write_char(QUOTE)?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        writer.write_str(element)?;
 | 
			
		||||
 | 
			
		||||
        if quote {
 | 
			
		||||
            writer.write_char(QUOTE)?;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    writer.write_str(closing)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn write_outputs(
 | 
			
		||||
    writer: &mut impl Write,
 | 
			
		||||
    outputs: BTreeMap<String, Output>,
 | 
			
		||||
) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_char(BRACKET_OPEN)?;
 | 
			
		||||
    for (ii, (output_name, output)) in outputs.iter().enumerate() {
 | 
			
		||||
        if ii > 0 {
 | 
			
		||||
            writer.write_char(COMMA)?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO(jrhahn) option to strip output
 | 
			
		||||
        let elements = vec![
 | 
			
		||||
            output_name,
 | 
			
		||||
            &output.path,
 | 
			
		||||
            &output.hash_algorithm,
 | 
			
		||||
            &output.hash,
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        write_array_elements(
 | 
			
		||||
            writer,
 | 
			
		||||
            true,
 | 
			
		||||
            &PAREN_OPEN.to_string(),
 | 
			
		||||
            &PAREN_CLOSE.to_string(),
 | 
			
		||||
            elements,
 | 
			
		||||
        )?
 | 
			
		||||
    }
 | 
			
		||||
    writer.write_char(BRACKET_CLOSE)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn write_input_derivations(
 | 
			
		||||
    writer: &mut impl Write,
 | 
			
		||||
    input_derivations: BTreeMap<String, Vec<String>>,
 | 
			
		||||
) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_char(COMMA)?;
 | 
			
		||||
    writer.write_char(BRACKET_OPEN)?;
 | 
			
		||||
 | 
			
		||||
    for (ii, (input_derivation_path, input_derivation)) in input_derivations.iter().enumerate() {
 | 
			
		||||
        if ii > 0 {
 | 
			
		||||
            writer.write_char(COMMA)?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        writer.write_char(PAREN_OPEN)?;
 | 
			
		||||
        writer.write_char(QUOTE)?;
 | 
			
		||||
        writer.write_str(input_derivation_path.as_str())?;
 | 
			
		||||
        writer.write_char(QUOTE)?;
 | 
			
		||||
        writer.write_char(COMMA)?;
 | 
			
		||||
 | 
			
		||||
        write_array_elements(
 | 
			
		||||
            writer,
 | 
			
		||||
            true,
 | 
			
		||||
            &BRACKET_OPEN.to_string(),
 | 
			
		||||
            &BRACKET_CLOSE.to_string(),
 | 
			
		||||
            input_derivation.iter().collect(),
 | 
			
		||||
        )?;
 | 
			
		||||
 | 
			
		||||
        writer.write_char(PAREN_CLOSE)?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    writer.write_char(BRACKET_CLOSE)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn write_input_sources(
 | 
			
		||||
    writer: &mut impl Write,
 | 
			
		||||
    input_sources: Vec<String>,
 | 
			
		||||
) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_char(COMMA)?;
 | 
			
		||||
    write_array_elements(
 | 
			
		||||
        writer,
 | 
			
		||||
        true,
 | 
			
		||||
        &BRACKET_OPEN.to_string(),
 | 
			
		||||
        &BRACKET_CLOSE.to_string(),
 | 
			
		||||
        input_sources.iter().collect(),
 | 
			
		||||
    )?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn write_platfrom(writer: &mut impl Write, platform: &str) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_char(COMMA)?;
 | 
			
		||||
    writer.write_str(escape_string(platform).as_str())?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn write_builder(writer: &mut impl Write, builder: &str) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_char(COMMA)?;
 | 
			
		||||
    writer.write_str(escape_string(builder).as_str())?;
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn write_arguments(writer: &mut impl Write, arguments: Vec<String>) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_char(COMMA)?;
 | 
			
		||||
    write_array_elements(
 | 
			
		||||
        writer,
 | 
			
		||||
        true,
 | 
			
		||||
        &BRACKET_OPEN.to_string(),
 | 
			
		||||
        &BRACKET_CLOSE.to_string(),
 | 
			
		||||
        arguments.iter().collect(),
 | 
			
		||||
    )?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn write_enviroment(
 | 
			
		||||
    writer: &mut impl Write,
 | 
			
		||||
    environment: BTreeMap<String, String>,
 | 
			
		||||
) -> Result<(), fmt::Error> {
 | 
			
		||||
    writer.write_char(COMMA)?;
 | 
			
		||||
    writer.write_char(BRACKET_OPEN)?;
 | 
			
		||||
 | 
			
		||||
    for (ii, (key, environment)) in environment.iter().enumerate() {
 | 
			
		||||
        if ii > 0 {
 | 
			
		||||
            writer.write_char(COMMA)?;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO(jrhahn) add strip option
 | 
			
		||||
        write_array_elements(
 | 
			
		||||
            writer,
 | 
			
		||||
            false,
 | 
			
		||||
            &PAREN_OPEN.to_string(),
 | 
			
		||||
            &PAREN_CLOSE.to_string(),
 | 
			
		||||
            vec![&escape_string(key), &escape_string(environment)],
 | 
			
		||||
        )?;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    writer.write_char(BRACKET_CLOSE)?;
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue