Function git_config::value::normalize_bstr
source · Expand description
&[u8]
variant of normalize
.
Examples found in repository?
src/file/section/body.rs (line 39)
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
pub fn value_implicit(&self, key: impl AsRef<str>) -> Option<Option<Cow<'_, BStr>>> {
let key = Key::from_str_unchecked(key.as_ref());
let (_key_range, range) = self.key_and_value_range_by(&key)?;
let range = match range {
None => return Some(None),
Some(range) => range,
};
let mut concatenated = BString::default();
for event in &self.0[range] {
match event {
Event::Value(v) => {
return Some(Some(normalize_bstr(v.as_ref())));
}
Event::ValueNotDone(v) => {
concatenated.push_str(v.as_ref());
}
Event::ValueDone(v) => {
concatenated.push_str(v.as_ref());
return Some(Some(normalize_bstring(concatenated)));
}
_ => (),
}
}
None
}
/// Retrieves all values that have the provided key name. This may return
/// an empty vec, which implies there were no values with the provided key.
#[must_use]
pub fn values(&self, key: impl AsRef<str>) -> Vec<Cow<'_, BStr>> {
let key = &Key::from_str_unchecked(key.as_ref());
let mut values = Vec::new();
let mut expect_value = false;
let mut concatenated_value = BString::default();
for event in &self.0 {
match event {
Event::SectionKey(event_key) if event_key == key => expect_value = true,
Event::Value(v) if expect_value => {
expect_value = false;
values.push(normalize_bstr(v.as_ref()));
}
Event::ValueNotDone(v) if expect_value => {
concatenated_value.push_str(v.as_ref());
}
Event::ValueDone(v) if expect_value => {
expect_value = false;
concatenated_value.push_str(v.as_ref());
values.push(normalize_bstring(std::mem::take(&mut concatenated_value)));
}
_ => (),
}
}
values
}
More examples
src/file/mutable/section.rs (line 232)
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
pub(crate) fn get<'key>(
&self,
key: &Key<'key>,
start: Index,
end: Index,
) -> Result<Cow<'_, BStr>, lookup::existing::Error> {
let mut expect_value = false;
let mut concatenated_value = BString::default();
for event in &self.section.0[start.0..end.0] {
match event {
Event::SectionKey(event_key) if event_key == key => expect_value = true,
Event::Value(v) if expect_value => return Ok(normalize_bstr(v.as_ref())),
Event::ValueNotDone(v) if expect_value => {
concatenated_value.push_str(v.as_ref());
}
Event::ValueDone(v) if expect_value => {
concatenated_value.push_str(v.as_ref());
return Ok(normalize_bstring(concatenated_value));
}
_ => (),
}
}
Err(lookup::existing::Error::KeyMissing)
}
src/value/normalize.rs (line 65)
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
pub fn normalize(input: Cow<'_, BStr>) -> Cow<'_, BStr> {
if input.as_ref() == "\"\"" {
return Cow::Borrowed("".into());
}
let size = input.len();
if size >= 3 && input[0] == b'"' && input[size - 1] == b'"' && input[size - 2] != b'\\' {
match input {
Cow::Borrowed(input) => return normalize_bstr(&input[1..size - 1]),
Cow::Owned(mut input) => {
input.pop();
input.remove(0);
return normalize_bstring(input);
}
}
}
if input.find_byteset(b"\\\"").is_none() {
return input;
}
let mut out: BString = Vec::with_capacity(input.len()).into();
let mut bytes = input.iter().copied();
while let Some(c) = bytes.next() {
match c {
b'\\' => match bytes.next() {
Some(b'n') => out.push(b'\n'),
Some(b't') => out.push(b'\t'),
Some(b'b') => {
out.pop();
}
Some(c) => {
out.push(c);
}
None => break,
},
b'"' => {}
_ => out.push(c),
}
}
Cow::Owned(out)
}
src/file/mutable/multi_value.rs (line 56)
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
pub fn get(&self) -> Result<Vec<Cow<'_, BStr>>, lookup::existing::Error> {
let mut expect_value = false;
let mut values = Vec::new();
let mut concatenated_value = BString::default();
for EntryData {
section_id,
offset_index,
} in &self.indices_and_sizes
{
let (offset, size) = MultiValueMut::index_and_size(&self.offsets, *section_id, *offset_index);
for event in &self.section.get(section_id).expect("known section id").as_ref()[offset..offset + size] {
match event {
Event::SectionKey(section_key) if *section_key == self.key => expect_value = true,
Event::Value(v) if expect_value => {
expect_value = false;
values.push(normalize_bstr(v.as_ref()));
}
Event::ValueNotDone(v) if expect_value => concatenated_value.push_str(v.as_ref()),
Event::ValueDone(v) if expect_value => {
expect_value = false;
concatenated_value.push_str(v.as_ref());
values.push(normalize_bstring(std::mem::take(&mut concatenated_value)));
}
_ => (),
}
}
}
if values.is_empty() {
return Err(lookup::existing::Error::KeyMissing);
}
Ok(values)
}