109 lines
3 KiB
Rust
109 lines
3 KiB
Rust
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
use derive_builder::Builder;
|
|
use derive_getters::Getters;
|
|
use derive_more::{Display, Error};
|
|
use serde::{Deserialize, Serialize};
|
|
use uuid::Uuid;
|
|
|
|
#[derive(Debug, Error, Display, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
|
pub enum AddStoreCommandError {
|
|
NameIsEmpty,
|
|
}
|
|
|
|
#[derive(
|
|
Clone, Builder, Debug, Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd, Getters,
|
|
)]
|
|
#[builder(build_fn(validate = "Self::validate"))]
|
|
pub struct AddStoreCommand {
|
|
#[builder(setter(custom))]
|
|
name: String,
|
|
#[builder(setter(custom))]
|
|
address: Option<String>,
|
|
store_id: Uuid,
|
|
owner: Uuid,
|
|
}
|
|
|
|
impl AddStoreCommandBuilder {
|
|
pub fn address(&mut self, address: Option<String>) -> &mut Self {
|
|
self.address = if let Some(address) = address {
|
|
let address = address.trim();
|
|
if address.is_empty() {
|
|
Some(None)
|
|
} else {
|
|
Some(Some(address.to_owned()))
|
|
}
|
|
} else {
|
|
Some(None)
|
|
};
|
|
self
|
|
}
|
|
|
|
pub fn name(&mut self, name: String) -> &mut Self {
|
|
self.name = Some(name.trim().to_owned());
|
|
self
|
|
}
|
|
|
|
fn validate(&self) -> Result<(), String> {
|
|
let name = self.name.as_ref().unwrap().trim().to_owned();
|
|
if name.is_empty() {
|
|
return Err(AddStoreCommandError::NameIsEmpty.to_string());
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use crate::tests::bdd::*;
|
|
use crate::utils::uuid::tests::*;
|
|
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_cmd() {
|
|
let name = "foo";
|
|
let address = "bar";
|
|
let owner = UUID;
|
|
|
|
// address = None
|
|
let cmd = AddStoreCommandBuilder::default()
|
|
.name(name.into())
|
|
.address(None)
|
|
.owner(owner)
|
|
.store_id(UUID)
|
|
.build()
|
|
.unwrap();
|
|
// let cmd = AddStoreCommand::new(name.into(), None, owner, UUID).unwrap();
|
|
assert_eq!(cmd.name(), name);
|
|
assert_eq!(cmd.address(), &None);
|
|
assert_eq!(cmd.owner(), &owner);
|
|
assert_eq!(*cmd.store_id(), UUID);
|
|
|
|
// address = Some
|
|
let cmd = AddStoreCommandBuilder::default()
|
|
.name(name.into())
|
|
.address(Some(address.into()))
|
|
.owner(owner)
|
|
.store_id(UUID)
|
|
.build()
|
|
.unwrap();
|
|
// let cmd = AddStoreCommand::new(name.into(), Some(address.into()), owner, UUID).unwrap();
|
|
assert_eq!(cmd.name(), name);
|
|
assert_eq!(cmd.address(), &Some(address.to_owned()));
|
|
assert_eq!(cmd.owner(), &owner);
|
|
assert_eq!(*cmd.store_id(), UUID);
|
|
|
|
// AddStoreCommandError::NameIsEmpty
|
|
|
|
assert!(AddStoreCommandBuilder::default()
|
|
.name("".into())
|
|
.address(Some(address.into()))
|
|
.owner(owner)
|
|
.store_id(UUID)
|
|
.build()
|
|
.is_err())
|
|
}
|
|
}
|