diff options
Diffstat (limited to 'src/utilities.rs')
-rw-r--r-- | src/utilities.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/utilities.rs b/src/utilities.rs index 2c7a43f..11d0e23 100644 --- a/src/utilities.rs +++ b/src/utilities.rs @@ -49,3 +49,47 @@ pub fn path_should_not_exist(path: &PathBuf, message: &str) { die!(message); } } + +pub fn deserialize_kv_with_message(data: &Vec<u8>) -> (HashMap<String, String>, String) { + let string_rep = String::from_utf8(data.clone()); + if string_rep.is_err() { + die!("Failed to parse commit data"); + } + let string_rep = string_rep.unwrap(); + let mut is_message = false; + let mut header: HashMap<String, String> = HashMap::new(); + let mut message = String::new(); + let mut last_key: Option<String> = None; + for line in string_rep.lines() { + if is_message { + message.push_str(format!("\n{}", line).as_str()); + continue; + } + + if line == "" { + is_message = true; + continue; + } + + if line.starts_with(" ") && last_key.is_some() { + let key = last_key.clone().unwrap(); + match header.get(&key) { + Some(val) => { + let mut new_val = val.clone(); + new_val.push_str(format!("\n{}", line).as_str()); + header.insert(key, new_val); + } + None => { + header.insert(key, line.to_string()); + } + } + } else { + let mut line_iter = line.splitn(2, ' '); + let key = line_iter.next().unwrap(); + let val = line_iter.next().unwrap(); + header.insert(key.to_string(), val.to_string()); + last_key = Some(key.to_string()); + } + } + (header, message) +} |