mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-05 22:21:31 +00:00
feat: idm v2 (#102)
* feat: rebuild idm to separate transport from content * feat: fast guest lookup table and host identification
This commit is contained in:
129
crates/krata/src/idm/internal.rs
Normal file
129
crates/krata/src/idm/internal.rs
Normal file
@ -0,0 +1,129 @@
|
||||
use anyhow::Result;
|
||||
use prost::Message;
|
||||
use prost_types::{ListValue, Value};
|
||||
|
||||
use super::serialize::{IdmRequest, IdmSerializable};
|
||||
|
||||
include!(concat!(env!("OUT_DIR"), "/krata.idm.internal.rs"));
|
||||
|
||||
pub const INTERNAL_IDM_CHANNEL: u64 = 0;
|
||||
|
||||
impl IdmSerializable for Event {
|
||||
fn encode(&self) -> Result<Vec<u8>> {
|
||||
Ok(self.encode_to_vec())
|
||||
}
|
||||
|
||||
fn decode(bytes: &[u8]) -> Result<Self> {
|
||||
Ok(<Self as prost::Message>::decode(bytes)?)
|
||||
}
|
||||
}
|
||||
|
||||
impl IdmSerializable for Request {
|
||||
fn encode(&self) -> Result<Vec<u8>> {
|
||||
Ok(self.encode_to_vec())
|
||||
}
|
||||
|
||||
fn decode(bytes: &[u8]) -> Result<Self> {
|
||||
Ok(<Self as prost::Message>::decode(bytes)?)
|
||||
}
|
||||
}
|
||||
|
||||
impl IdmRequest for Request {
|
||||
type Response = Response;
|
||||
}
|
||||
|
||||
impl IdmSerializable for Response {
|
||||
fn encode(&self) -> Result<Vec<u8>> {
|
||||
Ok(self.encode_to_vec())
|
||||
}
|
||||
|
||||
fn decode(bytes: &[u8]) -> Result<Self> {
|
||||
Ok(<Self as prost::Message>::decode(bytes)?)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait AsIdmMetricValue {
|
||||
fn as_metric_value(&self) -> Value;
|
||||
}
|
||||
|
||||
impl MetricNode {
|
||||
pub fn structural<N: AsRef<str>>(name: N, children: Vec<MetricNode>) -> MetricNode {
|
||||
MetricNode {
|
||||
name: name.as_ref().to_string(),
|
||||
value: None,
|
||||
format: MetricFormat::Unknown.into(),
|
||||
children,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn raw_value<N: AsRef<str>, V: AsIdmMetricValue>(name: N, value: V) -> MetricNode {
|
||||
MetricNode {
|
||||
name: name.as_ref().to_string(),
|
||||
value: Some(value.as_metric_value()),
|
||||
format: MetricFormat::Unknown.into(),
|
||||
children: vec![],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn value<N: AsRef<str>, V: AsIdmMetricValue>(
|
||||
name: N,
|
||||
value: V,
|
||||
format: MetricFormat,
|
||||
) -> MetricNode {
|
||||
MetricNode {
|
||||
name: name.as_ref().to_string(),
|
||||
value: Some(value.as_metric_value()),
|
||||
format: format.into(),
|
||||
children: vec![],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AsIdmMetricValue for String {
|
||||
fn as_metric_value(&self) -> Value {
|
||||
Value {
|
||||
kind: Some(prost_types::value::Kind::StringValue(self.to_string())),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AsIdmMetricValue for &str {
|
||||
fn as_metric_value(&self) -> Value {
|
||||
Value {
|
||||
kind: Some(prost_types::value::Kind::StringValue(self.to_string())),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AsIdmMetricValue for u64 {
|
||||
fn as_metric_value(&self) -> Value {
|
||||
numeric(*self as f64)
|
||||
}
|
||||
}
|
||||
|
||||
impl AsIdmMetricValue for i64 {
|
||||
fn as_metric_value(&self) -> Value {
|
||||
numeric(*self as f64)
|
||||
}
|
||||
}
|
||||
|
||||
impl AsIdmMetricValue for f64 {
|
||||
fn as_metric_value(&self) -> Value {
|
||||
numeric(*self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: AsIdmMetricValue> AsIdmMetricValue for Vec<T> {
|
||||
fn as_metric_value(&self) -> Value {
|
||||
let values = self.iter().map(|x| x.as_metric_value()).collect::<_>();
|
||||
Value {
|
||||
kind: Some(prost_types::value::Kind::ListValue(ListValue { values })),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn numeric(value: f64) -> Value {
|
||||
Value {
|
||||
kind: Some(prost_types::value::Kind::NumberValue(value)),
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user