diff options
author | Vincent Ambo <mail@tazj.in> | 2022-08-10T14·53+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-08-24T18·19+0000 |
commit | 6dc9ca5723ee46ade3ad3618ae780ec88ae884e2 (patch) | |
tree | 9bdf55af081c9dd0f9f59739b4455534f7cad39c /tvix/eval/src/value/string.rs | |
parent | c7ba2dec04c9c0bf7558285ed7d434e61ee5e5b5 (diff) |
feat(tvix/value): introduce string representation with &'static str r/4457
For cases where the strings are statically known (such as the oft-occuring name/value), this can be a useful optimisation. It's also much more convenient in tests. Change-Id: Ie462b684805bd4986ea5e85ca4bff663bc2d3c3c Reviewed-on: https://cl.tvl.fyi/c/depot/+/6111 Tested-by: BuildkiteCI Reviewed-by: eta <tvl@eta.st>
Diffstat (limited to 'tvix/eval/src/value/string.rs')
-rw-r--r-- | tvix/eval/src/value/string.rs | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/tvix/eval/src/value/string.rs b/tvix/eval/src/value/string.rs index d4776caea403..47661e03add4 100644 --- a/tvix/eval/src/value/string.rs +++ b/tvix/eval/src/value/string.rs @@ -4,16 +4,40 @@ use std::fmt::Display; /// backing implementations. #[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] -pub struct NixString(pub String); +pub enum NixString { + Static(&'static str), + Heap(String), +} impl Display for NixString { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(self.0.as_str()) + match self { + NixString::Static(s) => f.write_str(s), + NixString::Heap(s) => f.write_str(s), + } + } +} + +impl From<&'static str> for NixString { + fn from(s: &'static str) -> Self { + NixString::Static(s) } } -impl From<&str> for NixString { - fn from(s: &str) -> Self { - NixString(s.to_string()) +impl From<String> for NixString { + fn from(s: String) -> Self { + NixString::Heap(s) + } +} + +impl NixString { + pub const NAME: Self = NixString::Static("name"); + pub const VALUE: Self = NixString::Static("value"); + + pub fn as_str(&self) -> &str { + match self { + NixString::Static(s) => s, + NixString::Heap(s) => s, + } } } |