rested 0.11.0

Language/Interpreter for easily defining and running requests to an http server.
Documentation
use std::path::PathBuf;

use clap::{Args, ValueEnum};
use rested::interpreter::{
    environment::Environment,
    interpret_program,
    ir::{LogDestination, RequestItem},
    read_program_text,
};

#[derive(Debug, Args)]
pub struct SnapshotArgs {
    /// Format of the snapshot output
    pub output_format: Format,

    /// Path to the script to snapshot
    pub file: Option<PathBuf>,
}

#[derive(Debug, Clone, ValueEnum)]
pub enum Format {
    Curl,
}

impl SnapshotArgs {
    pub fn handle(self, env: Environment) -> anyhow::Result<()> {
        let code = read_program_text(self.file)?;
        let program = interpret_program(&code, env)?;

        for item in program.items.iter() {
            println!("{}\n", item.to_curl_string());
        }

        Ok(())
    }
}

trait ToCurlString {
    fn to_curl_string(&self) -> String;
}

impl ToCurlString for RequestItem {
    fn to_curl_string(&self) -> String {
        let mut buffer = String::new();

        if self.dbg {
            buffer.push_str("set -xe\n");
        }

        if let Some(name) = &self.name {
            buffer.push_str(&format!("echo {}", name))
        }

        buffer.push_str(&format!("curl -X {} ", self.request.method));

        for header in self.request.headers.iter() {
            buffer.push_str("-H ");
            buffer.push_str(&format!("\"{}: {}\" ", header.name, header.value));
        }

        if let Some(body) = &self.request.body {
            buffer.push_str(&format!("-d '{}' ", body));
        }

        buffer.push_str(&self.request.url);

        if let Some(dest) = &self.log_destination {
            match dest {
                LogDestination::File(path) => {
                    buffer.push_str(&format!(" 1> {}", path.to_string_lossy()))
                }
            }
        }

        if self.dbg {
            buffer.push_str("\nset +xe");
        }

        buffer
    }
}