neptune-auth 1.0.0

Crate for implementing message authorization for cosmwasm smart contracts.
Documentation
# neptune-auth
This package is used to manage the authentication of callers for any arbitrary message type.

**Usage**

The first step is to create some sort of config type which has access to stored addresses.
```rust
#[derive(Copy, Display)]
#[cw_serde]
pub enum Config {
    Admin,
    Bot,
}
```

Then you should impl GetPermissionGroup for the Config.
```rust
impl GetPermissionGroup for Config {
    fn get_permission_group(&self, deps: Deps<impl CustomQuery>, _env: &Env) -> Result<PermissionGroup, NeptAuthError> {
        // How your config accesses storage is up to you
        // Here we use a map from cw_storage_plus
        Ok(vec![self.load(deps).unwrap()].into())
    }
}
```

Then you can can assign a permission group for each variant in a given message type.
Here I use ExecuteMsg as an example.
```rust
use crate::config::Config::*;

impl NeptuneAuth for ExecuteMsg {
    fn permissions(&self) -> Result<Vec<&dyn GetPermissionGroup>, NeptAuthError> {
        Ok(match self {
            ExecuteMsg::SetConfig { .. } => vec![&Admin],
            ExecuteMsg::AddAsset { .. } => vec![&Bot],
            ExecuteMsg::RemoveAsset { .. } => vec![&Bot],
            ExecuteMsg::UpdatePrices { .. } => vec![&Admin, &Bot],
        })
    }
}
```

And finally you place the authorization check inside the execute entry point (or wherever else you'd like to verify authorization).
```rust
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn execute(deps: DepsMut<impl CustomQuery>, env: Env, info: MessageInfo, msg: ExecuteMsg) -> Result<Response, MyError> {
    // This is the line that checks the permissions
    // It will return an error if the caller does not have the required permissions
    msg.neptune_authorize(deps.as_ref(), &env, &info.sender)?;

    ...
}
```