diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2025-06-06 23:55:23 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2025-06-07 00:00:39 +0200 |
| commit | ad893a4fb44244132d710d7f94fc99a7d83f1b87 (patch) | |
| tree | b567690b5388de7919b6422e17b4637d3a323477 /server/common/src/grit.rs | |
| parent | f58f6b91e851897444186e9291804fc9b58bbd60 (diff) | |
grit: Add method for generating message translation id
reimplemented from a description of the grit id calculation
Diffstat (limited to 'server/common/src/grit.rs')
| -rw-r--r-- | server/common/src/grit.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/server/common/src/grit.rs b/server/common/src/grit.rs index dbf4f89..a510724 100644 --- a/server/common/src/grit.rs +++ b/server/common/src/grit.rs @@ -1156,3 +1156,36 @@ pub async fn parse_grit_with_parts(path: impl AsRef<Path>) -> anyhow::Result<Gri expand_messages(&mut grit.release.messages.messages, path).await?; Ok(grit) } + +fn get_presentable_content(message: &Message) -> String { + let mut ret = String::new(); + for c in &message.content { + match c { + TextPlaceholder::Text(value) => ret += value.as_str(), + TextPlaceholder::Placeholder { + name, + content: _, + example: _, + } => ret += name.as_str(), + } + } + ret +} + +fn fingerprint(value: &str) -> i64 { + u64::from_be_bytes(md5::compute(value).0[0..8].try_into().unwrap()).cast_signed() +} + +pub fn get_message_id(message: &Message) -> i64 { + let mut message_id = fingerprint(get_presentable_content(message).as_str()); + if let Some(meaning) = &message.meaning { + let meaning_id = fingerprint(meaning.as_str()); + if message_id < 0 { + message_id = (message_id << 1) + meaning_id + 1 + } else { + message_id = (message_id << 1) + meaning_id + } + } + // Avoid returning negative ids + message_id & 0x7fffffffffffffff +} |
