kong_rs 0.2.0

Plugin Development Kit for developing Kong plugins in Rust
Documentation
use std::collections::BTreeMap;

use client::ClientPDK;
use ctx::CtxPDK;
use log::LogPDK;
use ngx::NgxPDK;
use request::RequestPDK;
use response::ResponsePDK;
use router::RouterPDK;
use service::ServicePDK;

use crate::stream::Stream;

pub mod client;
pub mod ctx;
pub mod log;
pub mod ngx;
pub mod request;
pub mod response;
pub mod router;
pub mod service;

#[derive(Debug, Clone)]
pub enum Value {
  Null,
  Number(f64),
  String(String),
  Bool(bool),
  Struct(BTreeMap<String, Self>),
  List(Vec<Self>)
}

impl From<prost_types::value::Kind> for Value {
  fn from(value: prost_types::value::Kind) -> Self {
    match value {
      prost_types::value::Kind::NullValue(_) => Value::Null,
      prost_types::value::Kind::NumberValue(number) => Value::Number(number),
      prost_types::value::Kind::StringValue(str) => Value::String(str),
      prost_types::value::Kind::BoolValue(b) => Value::Bool(b),
      prost_types::value::Kind::StructValue(struct_val) => Value::Struct(
        struct_val.fields.into_iter().map(|(k, v)| (k, v.kind.map(|x| x.into()).unwrap_or(Value::Null))).collect()
      ),
      prost_types::value::Kind::ListValue(list_val) => Value::List(
        list_val.values.into_iter().map(|v| v.kind.map(|x| x.into()).unwrap_or(Value::Null)).collect()
      ),
    }
  }
}

impl Into<prost_types::value::Kind> for Value {
  fn into(self) -> prost_types::value::Kind {
    match self {
      Value::Null => prost_types::value::Kind::NullValue(0),
      Value::Number(number) => prost_types::value::Kind::NumberValue(number),
      Value::String(str) => prost_types::value::Kind::StringValue(str),
      Value::Bool(b) => prost_types::value::Kind::BoolValue(b),
      Value::Struct(fields) => prost_types::value::Kind::StructValue(
        prost_types::Struct { fields: fields.into_iter().map(|(k, v)| (k, prost_types::Value { kind: Some(v.into()) })).collect() }
      ),
      Value::List(values) => prost_types::value::Kind::ListValue(
        prost_types::ListValue { values: values.into_iter().map(|v| prost_types::Value { kind: Some(v.into()) }).collect() }
      ),
    }
  }
}


pub struct Pdk {
  client: ClientPDK,
  ctx: CtxPDK,
  log: LogPDK,
  ngx: NgxPDK,
  request: RequestPDK,
  response: ResponsePDK,
  router: RouterPDK,
  service: ServicePDK
}

impl Pdk {
  pub fn new(stream: Stream) -> Self {
    Self {
      client: ClientPDK::new(stream.clone()),
      ctx: CtxPDK::new(stream.clone()),
      log: LogPDK::new(stream.clone()),
      ngx: NgxPDK::new(stream.clone()),
      request: RequestPDK::new(stream.clone()),
      response: ResponsePDK::new(stream.clone()),
      router: RouterPDK::new(stream.clone()),
      service: ServicePDK::new(stream.clone()),
    }
  }

  pub fn client(&self) -> &ClientPDK {
    &self.client
  }

  pub fn ctx(&self) -> &CtxPDK {
    &self.ctx
  }

  pub fn log(&self) -> &LogPDK {
    &self.log
  }

  pub fn ngx(&self) -> &NgxPDK {
    &self.ngx
  }

  pub fn request(&self) -> &RequestPDK {
    &self.request
  }

  pub fn response(&self) -> &ResponsePDK {
    &self.response
  }

  pub fn router(&self) -> &RouterPDK {
    &self.router
  }

  pub fn service(&self) -> &ServicePDK {
    &self.service
  }
}