Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.10 KB | None | 0 0
  1. extern crate lambda_runtime as lambda;
  2. extern crate serde_derive;
  3. extern crate rusoto_core;
  4. extern crate rusoto_dynamodb;
  5.  
  6. use std::error::Error;
  7. use serde_derive::{Serialize, Deserialize};
  8. use lambda::{lambda, Context, error::HandlerError};
  9.  
  10. use rusoto_core::Region;
  11. use rusoto_dynamodb::{DynamoDb, DynamoDbClient, GetItemInput, AttributeValue};
  12. use std::collections::HashMap;
  13.  
  14. fn main() -> Result<(), Box<dyn Error>> {
  15. lambda!(validation_handler);
  16. Ok(())
  17. }
  18.  
  19. fn validation_handler(event: ValidationEvent, _ctx: Context) -> Result<ValidationResult, HandlerError> {
  20. Ok(validate_serial(event.serial_number.as_str()))
  21. }
  22.  
  23. enum ValidationError {
  24. InvalidFormat,
  25. AlreadyExists
  26. }
  27.  
  28. impl ValidationError {
  29. fn value(&self) -> String {
  30. match *self {
  31. ValidationError::InvalidFormat => String::from("invalid_format"),
  32. ValidationError::AlreadyExists => String::from("already_exists"),
  33. }
  34. }
  35. }
  36.  
  37. #[derive(Serialize, Deserialize)]
  38. struct ValidationResult {
  39. #[serde(rename = "isValid")]
  40. is_valid: bool,
  41. errors: Vec<String>
  42. }
  43.  
  44. #[derive(Serialize, Deserialize)]
  45. struct ValidationEvent {
  46. #[serde(rename = "serialNumber")]
  47. serial_number: String
  48. }
  49.  
  50. fn validate_serial(serial_number: &str) -> ValidationResult {
  51. let mut result = ValidationResult { is_valid: true, errors: Vec::new() };
  52.  
  53. if !validate_serial_length(serial_number) {
  54. result.is_valid = false;
  55. result.errors.push(ValidationError::InvalidFormat.value());
  56. }
  57.  
  58. if !validate_serial_alphanumeric(serial_number) {
  59. result.is_valid = false;
  60. result.errors.push(ValidationError::InvalidFormat.value());
  61. }
  62.  
  63. if !validate_serial_unique(serial_number) {
  64. result.is_valid = false;
  65. result.errors.push(ValidationError::AlreadyExists.value());
  66. }
  67.  
  68. return result;
  69. }
  70.  
  71. fn validate_serial_length(serial_number: &str) -> bool {
  72. serial_number.chars().count() >= 6
  73. }
  74.  
  75. fn validate_serial_alphanumeric(serial_number: &str) -> bool {
  76. serial_number.chars().all(char::is_alphanumeric)
  77. }
  78.  
  79. fn validate_serial_unique(serial_number: &str) -> bool {
  80. let mut query_key: HashMap<String, AttributeValue> = HashMap::new();
  81. query_key.insert(String::from("serial_number"), AttributeValue {
  82. s: Some(serial_number.to_string()),
  83. ..Default::default()
  84. });
  85.  
  86. let query_serials = GetItemInput {
  87. key: query_key,
  88. table_name: String::from("assets"),
  89. ..Default::default()
  90. };
  91.  
  92. let client = DynamoDbClient::new(Region::EuCentral1);
  93.  
  94. match client.get_item(query_serials).sync() {
  95. Ok(result) => {
  96. match result.item {
  97. Some(_) => false, // invalid, serial_number was found
  98. None => true // valid, serial_number was not found
  99. }
  100. },
  101. Err(error) => {
  102. panic!("Error: {:?}", error);
  103. },
  104. }
  105. }
  106.  
  107. #[cfg(test)]
  108. mod tests {
  109. use super::*;
  110.  
  111. #[test]
  112. fn validation_result_for_invalid_length() {
  113. let test_serial = "i234";
  114. let validation_result = validate_serial(test_serial);
  115. assert_eq!(false, validation_result.is_valid);
  116. assert_eq!(true, validation_result.errors.contains(&String::from("invalid_format")))
  117. }
  118.  
  119. #[test]
  120. fn validation_result_for_invalid_characters() {
  121. let test_serial = "i234@";
  122. let validation_result = validate_serial(test_serial);
  123. assert_eq!(false, validation_result.is_valid);
  124. assert_eq!(true, validation_result.errors.contains(&String::from("invalid_format")))
  125. }
  126.  
  127. #[test]
  128. fn validation_result_for_already_existing_serial() {
  129. let test_serial = "serial1";
  130. let validation_result = validate_serial(test_serial);
  131. assert_eq!(false, validation_result.is_valid);
  132. assert_eq!(true, validation_result.errors.contains(&String::from("already_exists")))
  133. }
  134.  
  135. #[test]
  136. fn validation_result_for_valid_serial() {
  137. let test_serial = "a12345bbc";
  138. let validation_result = validate_serial(test_serial);
  139. assert_eq!(true, validation_result.is_valid);
  140. assert_eq!(true, validation_result.errors.is_empty())
  141. }
  142.  
  143. #[test]
  144. fn validates_length_of_four_characters_as_invalid() {
  145. let test_serial = "i234";
  146. let validation_result = validate_serial_length(test_serial);
  147. assert_eq!(false, validation_result);
  148. }
  149.  
  150. #[test]
  151. fn validates_length_of_six_characters_as_valid() {
  152. let test_serial = "i23456";
  153. let validation_result = validate_serial_length(test_serial);
  154. assert_eq!(true, validation_result);
  155. }
  156.  
  157. #[test]
  158. fn validates_length_of_ten_characters_as_valid() {
  159. let test_serial = "i234567891";
  160. let validation_result = validate_serial_length(test_serial);
  161. assert_eq!(true, validation_result);
  162. }
  163.  
  164. #[test]
  165. fn validates_string_with_numbers_as_valid() {
  166. let test_serial = "234567891";
  167. let validation_result = validate_serial_alphanumeric(test_serial);
  168. assert_eq!(true, validation_result);
  169. }
  170.  
  171. #[test]
  172. fn validates_string_with_az_characters_as_valid() {
  173. let test_serial = "abcd1234";
  174. let validation_result = validate_serial_alphanumeric(test_serial);
  175. assert_eq!(true, validation_result);
  176. }
  177.  
  178. #[test]
  179. fn validates_string_with_unicode_characters_as_valid() {
  180. let test_serial = "абвгдежзийюя1234";
  181. let validation_result = validate_serial_alphanumeric(test_serial);
  182. assert_eq!(true, validation_result);
  183. }
  184.  
  185. #[test]
  186. fn validates_string_with_special_characters_as_invalid() {
  187. let test_serial = "abcd!1234";
  188. let validation_result = validate_serial_alphanumeric(test_serial);
  189. assert_eq!(false, validation_result);
  190. }
  191.  
  192. #[test]
  193. fn validates_existing_serial1_as_invalid() {
  194. let test_serial = "serial1";
  195. let validation_result = validate_serial_unique(test_serial);
  196. assert_eq!(false, validation_result);
  197. }
  198.  
  199. #[test]
  200. fn validates_new_serial4_as_valid() {
  201. let test_serial = "serial4";
  202. let validation_result = validate_serial_unique(test_serial);
  203. assert_eq!(true, validation_result);
  204. }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement