1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
use std::{
borrow::Cow,
convert::{Infallible, TryFrom},
path::Path,
};
use git_object::bstr::{BStr, BString, ByteSlice, ByteVec};
use crate::{FullNameRef, PartialNameRef};
pub type Error = git_validate::reference::name::Error;
impl<'a> FullNameRef<'a> {
pub fn to_path(self) -> Cow<'a, Path> {
self.0.to_path().expect("UTF-8 conversion always succeeds").into()
}
pub fn as_bstr(&self) -> &'a BStr {
self.0
}
}
impl<'a> PartialNameRef<'a> {
pub fn to_partial_path(&'a self) -> Cow<'a, Path> {
self.0.to_path().expect("UTF-8 conversion always succeeds").into()
}
pub fn as_bstr(&'a self) -> &'a BStr {
self.0.as_ref()
}
}
impl PartialNameRef<'static> {
pub fn join(self, component: impl AsRef<[u8]>) -> Result<Self, crate::name::Error> {
let mut b = self.0.into_owned();
b.push_byte(b'/');
b.extend(component.as_ref());
git_validate::reference::name_partial(b.as_ref())?;
Ok(PartialNameRef(b.into()))
}
}
impl<'a> TryFrom<&'a BStr> for FullNameRef<'a> {
type Error = Error;
fn try_from(v: &'a BStr) -> Result<Self, Self::Error> {
Ok(FullNameRef(git_validate::reference::name(v)?))
}
}
impl<'a> TryFrom<FullNameRef<'a>> for PartialNameRef<'a> {
type Error = Infallible;
fn try_from(v: FullNameRef<'a>) -> Result<Self, Self::Error> {
Ok(PartialNameRef(v.0.into()))
}
}
impl<'a> TryFrom<&'a BStr> for PartialNameRef<'a> {
type Error = Error;
fn try_from(v: &'a BStr) -> Result<Self, Self::Error> {
Ok(PartialNameRef(git_validate::reference::name_partial(v)?.into()))
}
}
impl<'a> TryFrom<&'a str> for FullNameRef<'a> {
type Error = Error;
fn try_from(v: &'a str) -> Result<Self, Self::Error> {
let v = v.as_bytes().as_bstr();
Ok(FullNameRef(git_validate::reference::name(v)?))
}
}
impl<'a> TryFrom<&'a str> for PartialNameRef<'a> {
type Error = Error;
fn try_from(v: &'a str) -> Result<Self, Self::Error> {
let v = v.as_bytes().as_bstr();
Ok(PartialNameRef(git_validate::reference::name_partial(v)?.into()))
}
}
impl<'a> TryFrom<&'a String> for FullNameRef<'a> {
type Error = Error;
fn try_from(v: &'a String) -> Result<Self, Self::Error> {
let v = v.as_bytes().as_bstr();
Ok(FullNameRef(git_validate::reference::name(v)?))
}
}
impl<'a> TryFrom<&'a String> for PartialNameRef<'a> {
type Error = Error;
fn try_from(v: &'a String) -> Result<Self, Self::Error> {
let v = v.as_bytes().as_bstr();
Ok(PartialNameRef(git_validate::reference::name_partial(v)?.into()))
}
}
impl TryFrom<String> for PartialNameRef<'static> {
type Error = Error;
fn try_from(v: String) -> Result<Self, Self::Error> {
git_validate::reference::name_partial(v.as_bytes().as_bstr())?;
Ok(PartialNameRef(BString::from(v).into()))
}
}
impl TryFrom<BString> for PartialNameRef<'static> {
type Error = Error;
fn try_from(v: BString) -> Result<Self, Self::Error> {
git_validate::reference::name_partial(v.as_ref())?;
Ok(PartialNameRef(v.into()))
}
}