[][src]Crate protofish

Protofish is a decoder focused on decoding arbitrary protocol buffer messages with error recovery. Its primary use case is decoding gRPC mesages in proxide based on .proto-files supplied by the user at runtime.

use protofish::{Context, Value, UnknownValue};
use bytes::Bytes;

let context = Context::parse(&[r#"
  syntax = "proto3";
  package Proto;

  message Request { string kind = 1; }
  message Response { int32 distance = 1; }
  service Fish {
    rpc Swim( Request ) returns ( Response );
  }
"#]).unwrap();

let service = context.get_service("Proto.Fish").unwrap();
let rpc = service.rpc_by_name("Swim").unwrap();

let input = rpc.input.message.decode(b"\x0a\x05Perch", &context);
assert_eq!(input.fields[0].number, 1);
assert_eq!(input.fields[0].value, Value::String(String::from("Perch")));

let output = rpc.output.message.decode(b"\x08\xa9\x46", &context);
assert_eq!(output.fields[0].number, 1);
assert_eq!(output.fields[0].value, Value::Int32(9001));

let request = context.get_message("Proto.Request").unwrap();
let value = request.decode(b"\x12\x07Unknown\x0a\x0fAtlantic ", &context);
assert_eq!(value.fields[0].number, 2);
assert_eq!(
    value.fields[0].value,
    Value::Unknown(UnknownValue::VariableLength(Bytes::from_static(b"Unknown"))));
assert_eq!(
    value.fields[1].value,
    Value::Incomplete(Bytes::from_static(b"\x0fAtlantic ")));

Re-exports

pub use crate::context::Context;
pub use crate::context::Error;
pub use crate::context::MessageInfo;
pub use crate::context::Result;
pub use crate::decode::EnumValue;
pub use crate::decode::MessageValue;
pub use crate::decode::UnknownValue;
pub use crate::decode::Value;

Modules

context

Decoding context built from the proto-files.

decode

Protocol buffer binary payload decoding.