receipt.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. use serde::Deserialize;
  2. use std::fmt;
  3. #[derive(Deserialize)]
  4. pub struct Item {
  5. pub name: String,
  6. pub sum: i64,
  7. }
  8. impl fmt::Display for Item {
  9. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  10. write!(f, "{}:{}", self.name, self.sum)
  11. }
  12. }
  13. #[allow(dead_code)]
  14. #[allow(non_snake_case)]
  15. #[derive(Deserialize)]
  16. struct Receipt {
  17. totalSum: i64,
  18. items: Vec<Item>,
  19. }
  20. #[allow(dead_code)]
  21. #[derive(Deserialize)]
  22. struct Document {
  23. receipt: Receipt,
  24. }
  25. #[allow(dead_code)]
  26. #[derive(Deserialize)]
  27. struct Input {
  28. document: Document,
  29. }
  30. pub fn parse_receipt(line: &str) -> Vec<Item> {
  31. let result: Input = serde_json::from_str(&line).unwrap();
  32. result.document.receipt.items
  33. }
  34. #[cfg(test)]
  35. mod receipt {
  36. use super::*;
  37. #[test]
  38. fn item() {
  39. let line = String::from(
  40. r#"
  41. {
  42. "quantity" : 1,
  43. "ndsRate" : 1,
  44. "price" : 5549,
  45. "calculationSubjectSign" : 1,
  46. "calculationTypeSign" : 4,
  47. "name" : "ХРЕН РУССКИЙ 170Г",
  48. "sum" : 5549
  49. }
  50. "#,
  51. );
  52. let testit: Item = serde_json::from_str(&line).unwrap();
  53. assert_eq!(testit.name, "ХРЕН РУССКИЙ 170Г");
  54. assert_eq!(testit.sum, 5549);
  55. }
  56. #[test]
  57. fn receipt() {
  58. let line = String::from(
  59. r#"
  60. {
  61. "totalSum" : 548702,
  62. "userInn" : "7703270067",
  63. "operator" : "Теpминал 24",
  64. "items" : [
  65. {
  66. "quantity" : 1,
  67. "ndsRate" : 1,
  68. "price" : 5549,
  69. "calculationSubjectSign" : 1,
  70. "calculationTypeSign" : 4,
  71. "name" : "ХРЕН РУССКИЙ 170Г",
  72. "sum" : 5549
  73. },
  74. {
  75. "quantity" : 1,
  76. "ndsRate" : 1,
  77. "price" : 20599,
  78. "calculationSubjectSign" : 1,
  79. "calculationTypeSign" : 4,
  80. "name" : "СОУС ОСТР.380Г КИНТО",
  81. "sum" : 20599
  82. }
  83. ]
  84. }
  85. "#,
  86. );
  87. let testit: Receipt = serde_json::from_str(&line).unwrap();
  88. assert_eq!(testit.totalSum, 548702);
  89. assert_eq!(testit.items.len(), 2);
  90. assert_eq!(testit.items[0].sum, 5549);
  91. assert_eq!(testit.items[1].sum, 20599);
  92. }
  93. #[test]
  94. fn input() {
  95. let line = String::from(
  96. r#"
  97. {
  98. "document" : {
  99. "receipt" : {
  100. "totalSum" : 548702,
  101. "userInn" : "7703270067",
  102. "operator" : "Теpминал 24",
  103. "items" : [
  104. {
  105. "quantity" : 1,
  106. "ndsRate" : 1,
  107. "price" : 5549,
  108. "calculationSubjectSign" : 1,
  109. "calculationTypeSign" : 4,
  110. "name" : "ХРЕН РУССКИЙ 170Г",
  111. "sum" : 5549
  112. },
  113. {
  114. "quantity" : 1,
  115. "ndsRate" : 1,
  116. "price" : 20599,
  117. "calculationSubjectSign" : 1,
  118. "calculationTypeSign" : 4,
  119. "name" : "СОУС ОСТР.380Г КИНТО",
  120. "sum" : 20599
  121. }
  122. ]
  123. }
  124. }
  125. }
  126. "#,
  127. );
  128. let testit: Input = serde_json::from_str(&line).unwrap();
  129. assert_eq!(testit.document.receipt.totalSum, 548702);
  130. assert_eq!(testit.document.receipt.items.len(), 2);
  131. assert_eq!(testit.document.receipt.items[0].sum, 5549);
  132. assert_eq!(testit.document.receipt.items[1].sum, 20599);
  133. }
  134. #[test]
  135. fn display() {
  136. let it = Item {
  137. name: "test".to_string(),
  138. sum: 1000,
  139. };
  140. let line = format!("{}", it.to_string());
  141. assert_eq!(line, "test:1000");
  142. }
  143. }