Przeglądaj źródła

bin/taud: add find_free_id function

ghassmo 4 lat temu
rodzic
commit
1da5edf4af
1 zmienionych plików z 37 dodań i 4 usunięć
  1. 37 4
      bin/taud/src/main.rs

+ 37 - 4
bin/taud/src/main.rs

@@ -40,6 +40,15 @@ fn random_ref_id() -> String {
     thread_rng().sample_iter(&Alphanumeric).take(30).map(char::from).collect()
 }
 
+fn find_free_id(tasks_ids: &Vec<u32>) -> u32 {
+    for i in 1.. {
+        if !tasks_ids.contains(&i) {
+            return i
+        }
+    }
+    1
+}
+
 #[derive(Clone, Debug, Serialize, Deserialize)]
 struct Timestamp(String);
 
@@ -187,14 +196,12 @@ impl JsonRpcInterface {
     // --> {"jsonrpc": "2.0", "method": "add", "params": ["title", "desc", ["assign"], ["project"], "due", "rank"], "id": 1}
     // <-- {"jsonrpc": "2.0", "result": true, "id": 1}
     async fn add(&self, id: Value, params: Value) -> JsonResult {
-        let args = params.as_array();
+        let args = params.as_array().unwrap();
 
-        if args.is_none() && args.unwrap().len() != 6 {
+        if args.len() != 6 {
             return JsonResult::Err(jsonerr(InvalidParams, None, id))
         }
 
-        let args = args.unwrap();
-
         let mut task: TaskInfo;
 
         match (args[0].as_str(), args[1].as_str(), args[5].as_u64()) {
@@ -265,3 +272,29 @@ async fn main() -> Result<()> {
     let ex = Arc::new(Executor::new());
     smol::block_on(ex.run(start(config, ex.clone())))
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn find_free_id_test() -> Result<()> {
+        let mut ids: Vec<u32> = vec![1, 3, 8, 9, 10, 3];
+        let ids_empty: Vec<u32> = vec![];
+        let ids_duplicate: Vec<u32> = vec![1; 100];
+
+        let find_id = find_free_id(&ids);
+
+        assert_eq!(find_id, 2);
+
+        ids.push(find_id);
+
+        assert_eq!(find_free_id(&ids), 4);
+
+        assert_eq!(find_free_id(&ids_empty), 1);
+
+        assert_eq!(find_free_id(&ids_duplicate), 2);
+
+        Ok(())
+    }
+}