http_nu/
response.rs

1use nu_protocol::Value;
2use std::collections::HashMap;
3use std::path::PathBuf;
4
5#[derive(Clone, Debug)]
6pub enum HeaderValue {
7    Single(String),
8    Multiple(Vec<String>),
9}
10
11#[derive(Clone, Debug)]
12pub struct Response {
13    pub status: u16,
14    pub headers: HashMap<String, HeaderValue>,
15    pub body_type: ResponseBodyType,
16}
17
18#[derive(Clone, Debug)]
19pub enum ResponseBodyType {
20    Normal,
21    Static {
22        root: PathBuf,
23        path: String,
24        fallback: Option<String>,
25    },
26    ReverseProxy {
27        target_url: String,
28        headers: HashMap<String, HeaderValue>,
29        preserve_host: bool,
30        strip_prefix: Option<String>,
31        request_body: Vec<u8>,
32        query: Option<HashMap<String, String>>,
33    },
34}
35
36#[derive(Debug)]
37pub enum ResponseTransport {
38    Empty,
39    Full(Vec<u8>),
40    Stream(tokio::sync::mpsc::Receiver<Vec<u8>>),
41}
42
43pub fn value_to_json(value: &Value) -> serde_json::Value {
44    match value {
45        Value::Nothing { .. } => serde_json::Value::Null,
46        Value::Bool { val, .. } => serde_json::Value::Bool(*val),
47        Value::Int { val, .. } => serde_json::Value::Number((*val).into()),
48        Value::Float { val, .. } => serde_json::Number::from_f64(*val)
49            .map(serde_json::Value::Number)
50            .unwrap_or(serde_json::Value::Null),
51        Value::String { val, .. } => serde_json::Value::String(val.clone()),
52        Value::List { vals, .. } => {
53            serde_json::Value::Array(vals.iter().map(value_to_json).collect())
54        }
55        Value::Record { val, .. } => {
56            let mut map = serde_json::Map::new();
57            for (k, v) in val.iter() {
58                map.insert(k.clone(), value_to_json(v));
59            }
60            serde_json::Value::Object(map)
61        }
62        _ => todo!(),
63    }
64}
65
66pub fn value_to_bytes(value: Value) -> Vec<u8> {
67    match value {
68        Value::Nothing { .. } => Vec::new(),
69        Value::String { val, .. } => val.into_bytes(),
70        Value::Int { val, .. } => val.to_string().into_bytes(),
71        Value::Float { val, .. } => val.to_string().into_bytes(),
72        Value::Binary { val, .. } => val,
73        Value::Bool { val, .. } => val.to_string().into_bytes(),
74
75        // Both Lists and Records are encoded as JSON
76        Value::List { .. } | Value::Record { .. } => serde_json::to_string(&value_to_json(&value))
77            .unwrap_or_else(|_| String::new())
78            .into_bytes(),
79
80        _ => todo!("value_to_bytes: {:?}", value),
81    }
82}