watermelon 0.4.4

High level actor based implementation NATS Core and NATS Jetstream client implementation
Documentation
use std::path::PathBuf;

use serde::{Deserialize, Deserializer, de};
use watermelon_nkeys::KeyPair;
use watermelon_proto::Subject;

#[derive(Debug, Deserialize)]
pub(super) struct FromEnv {
    #[serde(flatten)]
    pub(super) auth: AuthenticationMethod,
    pub(super) inbox_prefix: Option<Subject>,
}

#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub(super) enum AuthenticationMethod {
    Creds {
        #[serde(rename = "nats_jwt")]
        jwt: String,
        #[serde(rename = "nats_nkey", deserialize_with = "deserialize_nkey")]
        nkey: KeyPair,
    },
    CredsFile {
        #[serde(rename = "nats_creds_file")]
        creds_file: PathBuf,
    },
    UserAndPassword {
        #[serde(rename = "nats_username")]
        username: String,
        #[serde(rename = "nats_password")]
        password: String,
    },
    None,
}

fn deserialize_nkey<'de, D>(deserializer: D) -> Result<KeyPair, D::Error>
where
    D: Deserializer<'de>,
{
    let secret = String::deserialize(deserializer)?;
    KeyPair::from_encoded_seed(&secret).map_err(de::Error::custom)
}