tonic-web-wasm-client 0.7.1

grpc-web implementation for use by tonic clients in browsers via webassembly
Documentation
use crate::Error;

const GRPC_WEB: &str = "application/grpc-web";
const GRPC_WEB_PROTO: &str = "application/grpc-web+proto";
const GRPC_WEB_TEXT: &str = "application/grpc-web-text";
const GRPC_WEB_TEXT_PROTO: &str = "application/grpc-web-text+proto";

#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Encoding {
    Base64,
    None,
}

impl Encoding {
    pub fn from_content_type(content_type: &str) -> Result<Self, Error> {
        for ct in content_type.split(';') {
            match ct.trim() {
                GRPC_WEB_TEXT | GRPC_WEB_TEXT_PROTO => return Ok(Encoding::Base64),
                GRPC_WEB | GRPC_WEB_PROTO => return Ok(Encoding::None),
                _ => continue,
            }
        }
        Err(Error::InvalidContentType(content_type.to_owned()))
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_encoding_from_content_type() {
        let vals = [
            (GRPC_WEB, Encoding::None),
            (GRPC_WEB_PROTO, Encoding::None),
            (GRPC_WEB_TEXT, Encoding::Base64),
            (GRPC_WEB_TEXT_PROTO, Encoding::Base64),
            ("application/grpc-web+proto;charset=utf-8", Encoding::None),
            ("application/grpc-web+proto; charset=utf-8", Encoding::None),
            ("charset=utf-8; application/grpc-web+proto", Encoding::None),
        ];
        for (content_type, expected) in vals.iter() {
            assert_eq!(
                Encoding::from_content_type(content_type).ok(),
                Some(*expected)
            );
        }
    }
}