1use objects::object::ChangeId;
5
6use super::{Head, RefExpectation, RefUpdate, resolve_refspec};
7
8pub trait CoreRefBackend: Send + Sync {
10 type Error;
11
12 fn read_head(&self) -> Result<Head, Self::Error>;
13 fn write_head(&self, head: &Head) -> Result<(), Self::Error>;
14 fn write_head_cas(
15 &self,
16 expected: RefExpectation<Head>,
17 head: &Head,
18 ) -> Result<(), Self::Error>;
19
20 fn get_thread(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
21 fn set_thread(&self, name: &str, state: &ChangeId) -> Result<(), Self::Error>;
22 fn set_thread_cas(
23 &self,
24 name: &str,
25 expected: RefExpectation<ChangeId>,
26 state: &ChangeId,
27 ) -> Result<(), Self::Error>;
28 fn delete_thread(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
29 fn delete_thread_cas(
30 &self,
31 name: &str,
32 expected: RefExpectation<ChangeId>,
33 ) -> Result<(), Self::Error>;
34 fn list_threads(&self) -> Result<Vec<String>, Self::Error>;
35
36 fn get_marker(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
37 fn create_marker(&self, name: &str, state: &ChangeId) -> Result<(), Self::Error>;
38 fn set_marker_cas(
39 &self,
40 name: &str,
41 expected: RefExpectation<ChangeId>,
42 state: &ChangeId,
43 ) -> Result<(), Self::Error>;
44 fn delete_marker(&self, name: &str) -> Result<Option<ChangeId>, Self::Error>;
45 fn delete_marker_cas(
46 &self,
47 name: &str,
48 expected: RefExpectation<ChangeId>,
49 ) -> Result<(), Self::Error>;
50 fn list_markers(&self) -> Result<Vec<String>, Self::Error>;
51
52 fn update_refs(&self, updates: &[RefUpdate]) -> Result<(), Self::Error>;
53
54 fn resolve(&self, refspec: &str) -> Result<Option<ChangeId>, Self::Error> {
55 resolve_refspec(
56 refspec,
57 || self.read_head(),
58 |name| self.get_thread(name),
59 |name| self.get_marker(name),
60 )
61 }
62}