feat(tvix/value): introduce string representation with &'static str

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>
This commit is contained in:
Vincent Ambo 2022-08-10 17:53:22 +03:00 committed by tazjin
parent c7ba2dec04
commit 6dc9ca5723
4 changed files with 44 additions and 26 deletions

View file

@ -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<&str> for NixString {
fn from(s: &str) -> Self {
NixString(s.to_string())
impl From<&'static str> for NixString {
fn from(s: &'static str) -> Self {
NixString::Static(s)
}
}
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,
}
}
}