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 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}