I should be working...
This commit is contained in:
1 parent
7ecbf250a0
commit
6294814f62
6 files changed
+237
-5
No files matched your search
Generated
+41
@@ -13,6 +13,15 @@ dependencies = [
|
|||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "0.7.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atty"
|
name = "atty"
|
||||||
version = "0.2.14"
|
version = "0.2.14"
|
||||||
@@ -144,8 +153,11 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"clap-verbosity-flag",
|
"clap-verbosity-flag",
|
||||||
|
"hex",
|
||||||
"home",
|
"home",
|
||||||
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
|
"regex",
|
||||||
"resource",
|
"resource",
|
||||||
"rusqlite",
|
"rusqlite",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -220,6 +232,12 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hex"
|
||||||
|
version = "0.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "home"
|
name = "home"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
@@ -267,6 +285,12 @@ dependencies = [
|
|||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num_threads"
|
name = "num_threads"
|
||||||
version = "0.1.6"
|
version = "0.1.6"
|
||||||
@@ -336,6 +360,23 @@ dependencies = [
|
|||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.6.28"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "resource"
|
name = "resource"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
|||||||
+4
-1
@@ -15,4 +15,7 @@ log = "0.4.17"
|
|||||||
home = "0.5.4"
|
home = "0.5.4"
|
||||||
sha2 = "0.10.6"
|
sha2 = "0.10.6"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
resource = "0.5.0"
|
resource = "0.5.0"
|
||||||
|
hex = "0.4.3"
|
||||||
|
regex = "1.7.0"
|
||||||
|
lazy_static = "1.4.0"
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
use crate::db::_external_id::ExternalId;
|
||||||
|
|
||||||
|
pub struct SecurityEmitterCheque {
|
||||||
|
drawer_user_id: ExternalId,
|
||||||
|
security_id: ExternalId,
|
||||||
|
cheque_number: u32,
|
||||||
|
amount: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cheque {
|
||||||
|
pub fn is_valid(self: &Cheque) -> bool {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn cash_cheque(&self){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
use std::io::Read;
|
||||||
|
|
||||||
|
use regex::{Captures, Regex};
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
struct SafeId {
|
||||||
|
encrypted_id: [u8; 4],
|
||||||
|
signature: [u8; 4],
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Debug)]
|
||||||
|
pub enum ExternalId {
|
||||||
|
AccountId(SafeId),
|
||||||
|
UserId(SafeId),
|
||||||
|
SecurityId(SafeId),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToString for SafeId {
|
||||||
|
fn to_string(&self) -> String {
|
||||||
|
format!("{}-{}", hex::encode(self.encrypted_id), hex::encode(self.signature))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize_str(s: &str) -> Option<[u8; 4]> {
|
||||||
|
let mut encrypted_id_bytes = [0u8; 4];
|
||||||
|
let r = hex::decode_to_slice(s, &mut encrypted_id_bytes as &mut [u8]);
|
||||||
|
return match r {
|
||||||
|
Ok(_) => Some(encrypted_id_bytes),
|
||||||
|
Err(_) => None
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SafeId {
|
||||||
|
fn from_regex_captures(caps: &Captures) -> Option<SafeId> {
|
||||||
|
let encrypted_id = caps.name("id")?;
|
||||||
|
let signature = caps.name("sign")?;
|
||||||
|
|
||||||
|
Some(SafeId {
|
||||||
|
encrypted_id: deserialize_str(&encrypted_id.as_str())?,
|
||||||
|
signature: deserialize_str(&signature.as_str())?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_string(s: &String) -> Option<SafeId> {
|
||||||
|
let external_id_pattern = Regex::new(r"^(?P<id>\w+)-(?P<sign>\w+)$").unwrap();
|
||||||
|
let caps = external_id_pattern.captures(&s)?;
|
||||||
|
return Self::from_regex_captures(&caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_id(id: u32) -> SafeId {
|
||||||
|
let bytes = u32::to_be_bytes(id);
|
||||||
|
SafeId {
|
||||||
|
encrypted_id: bytes,
|
||||||
|
signature: bytes,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_id(&self) -> u32 {
|
||||||
|
return u32::from_be_bytes(self.encrypted_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl ToString for ExternalId {
|
||||||
|
fn to_string(&self) -> String {
|
||||||
|
match self {
|
||||||
|
ExternalId::UserId(sid) => format!("a-{}", sid.to_string()),
|
||||||
|
ExternalId::AccountId(sid) => format!("u-{}", sid.to_string()),
|
||||||
|
ExternalId::SecurityId(sid) => format!("s-{}", sid.to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl ExternalId {
|
||||||
|
pub fn from_string(s: &String) -> Option<ExternalId> {
|
||||||
|
let pattern = Regex::new(r"^(?P<type>\w)-(?P<id>\w+)-(?P<sign>\w+)$").unwrap();
|
||||||
|
let caps = pattern.captures(&s)?;
|
||||||
|
|
||||||
|
match caps.name("type")?.as_str() {
|
||||||
|
"a" => Some(ExternalId::AccountId(SafeId::from_regex_captures(&caps)?)),
|
||||||
|
"u" => Some(ExternalId::UserId(SafeId::from_regex_captures(&caps)?)),
|
||||||
|
"s" => Some(ExternalId::SecurityId(SafeId::from_regex_captures(&caps)?)),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_id(&self) -> u32 {
|
||||||
|
match self {
|
||||||
|
ExternalId::UserId(x) => x.get_id(),
|
||||||
|
ExternalId::AccountId(x) => x.get_id(),
|
||||||
|
ExternalId::SecurityId(x) => x.get_id(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub mod test_util {
|
||||||
|
use std::any::Any;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn safe_id_happy_path_1() {
|
||||||
|
let sid = SafeId { encrypted_id: [1, 2, 3, 4], signature: [7, 8, 9, 10] };
|
||||||
|
assert_eq!("01020304-0708090a".to_string(), sid.to_string());
|
||||||
|
let deserialized_eid = SafeId::from_string(&sid.to_string()).unwrap();
|
||||||
|
assert_eq!(sid, deserialized_eid);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn safe_id_happy_path_2() {
|
||||||
|
let sid = SafeId::from_id(56);
|
||||||
|
assert_eq!("00000038-00000038".to_string(), sid.to_string());
|
||||||
|
let deserialized_eid = SafeId::from_string(&sid.to_string()).unwrap();
|
||||||
|
assert_eq!(sid, deserialized_eid);
|
||||||
|
assert_eq!(56, deserialized_eid.get_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn safe_id_un_happy_path() {
|
||||||
|
let bad_strings = vec!["a", "a-b", "01020304-0708090É"];
|
||||||
|
for bad_string in bad_strings.iter() {
|
||||||
|
let ret = SafeId::from_string(&bad_string.to_string());
|
||||||
|
assert!(ret.is_none(), "This should not be a valid safe id: {}", bad_string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn external_id_simple_test() {
|
||||||
|
let eid = ExternalId::from_string(&"u-01020304-0708090a".to_string()).unwrap();
|
||||||
|
assert!(match eid {
|
||||||
|
ExternalId::UserId(_) => true,
|
||||||
|
_ => false
|
||||||
|
});
|
||||||
|
|
||||||
|
let eid = ExternalId::from_string(&"a-01020304-0708090a".to_string()).unwrap();
|
||||||
|
assert!(match eid {
|
||||||
|
ExternalId::AccountId(_) => true,
|
||||||
|
_ => false
|
||||||
|
});
|
||||||
|
|
||||||
|
let eid = ExternalId::from_string(&"s-01020304-0708090a".to_string()).unwrap();
|
||||||
|
assert!(match eid {
|
||||||
|
ExternalId::SecurityId(_) => true,
|
||||||
|
_ => false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-2
@@ -1,16 +1,21 @@
|
|||||||
mod _users;
|
mod _users;
|
||||||
mod _securities;
|
mod _securities;
|
||||||
mod _accounts;
|
mod _accounts;
|
||||||
|
mod _cheques;
|
||||||
|
mod _external_id;
|
||||||
|
|
||||||
pub mod securities{
|
pub mod securities{
|
||||||
pub use super::_securities::{list_securities, get_security_by_id, Security};
|
pub use super::_securities::{list_securities, get_security_by_id, Security};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod users{
|
pub mod users {
|
||||||
pub use super::_users::{create_user, list_users, User};
|
pub use super::_users::{create_user, list_users, User};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod accounts {
|
pub mod accounts {
|
||||||
pub use super::_accounts::{get_account_by_id, list_accounts, create_account, Account};
|
pub use super::_accounts::{get_account_by_id, list_accounts, create_account, Account};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod cheques {
|
||||||
|
pub use super::_cheques::{Cheque};
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,20 @@
|
|||||||
use rusqlite::{Transaction, Result};
|
use rusqlite::{Transaction, Result};
|
||||||
use crate::db::accounts::get_account_by_id;
|
use crate::db::accounts::get_account_by_id;
|
||||||
|
use crate::db::cheques::Cheque;
|
||||||
use crate::db::securities::get_security_by_id;
|
use crate::db::securities::get_security_by_id;
|
||||||
|
|
||||||
fn update_account(tx: & Transaction, account_id: u32) -> Result<()>{
|
|
||||||
|
|
||||||
|
fn cash_cheque(cheque: &Cheque) -> Result<()> {
|
||||||
|
if !cheque.is_valid() {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update_account(tx: &Transaction, account_id: u32) -> Result<()> {
|
||||||
let account = get_account_by_id(tx, account_id)?;
|
let account = get_account_by_id(tx, account_id)?;
|
||||||
// let sec = get_security_by_id(tx, account.)
|
// let sec = get_security_by_id(tx, account.)
|
||||||
return Ok(())
|
return Ok(());
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user