pub trait CoreRefBackend: Send + Sync {
type Error;
Show 17 methods
// Required methods
fn read_head(&self) -> Result<Head, Self::Error>;
fn write_head(&self, head: &Head) -> Result<(), Self::Error>;
fn write_head_cas(
&self,
expected: RefExpectation<Head>,
head: &Head,
) -> Result<(), Self::Error>;
fn get_thread(
&self,
name: &ThreadName,
) -> impl Future<Output = Result<Option<ChangeId>, Self::Error>> + Send;
fn set_thread(
&self,
name: &ThreadName,
state: &ChangeId,
) -> Result<(), Self::Error>;
fn set_thread_cas(
&self,
name: &ThreadName,
expected: RefExpectation<ChangeId>,
state: &ChangeId,
) -> Result<(), Self::Error>;
fn delete_thread(
&self,
name: &ThreadName,
) -> Result<Option<ChangeId>, Self::Error>;
fn delete_thread_cas(
&self,
name: &ThreadName,
expected: RefExpectation<ChangeId>,
) -> Result<(), Self::Error>;
fn list_threads(&self) -> Result<Vec<ThreadName>, Self::Error>;
fn get_marker(
&self,
name: &MarkerName,
) -> impl Future<Output = Result<Option<ChangeId>, Self::Error>> + Send;
fn create_marker(
&self,
name: &MarkerName,
state: &ChangeId,
) -> impl Future<Output = Result<(), Self::Error>> + Send;
fn set_marker_cas(
&self,
name: &MarkerName,
expected: RefExpectation<ChangeId>,
state: &ChangeId,
) -> Result<(), Self::Error>;
fn delete_marker(
&self,
name: &MarkerName,
) -> Result<Option<ChangeId>, Self::Error>;
fn delete_marker_cas(
&self,
name: &MarkerName,
expected: RefExpectation<ChangeId>,
) -> Result<(), Self::Error>;
fn list_markers(&self) -> Result<Vec<MarkerName>, Self::Error>;
fn update_refs(&self, updates: &[RefUpdate]) -> Result<(), Self::Error>;
// Provided method
fn resolve(
&self,
refspec: &str,
) -> impl Future<Output = Result<Option<ChangeId>, Self::Error>> + Send { ... }
}Expand description
Shared refs backend operations usable by both local and hosted backends.
The database-hitting reads (get_thread, get_marker, create_marker,
resolve) are async so the Postgres backend can .await sqlx
directly instead of bridging through a worker-thread runtime. They’re
spelled as -> impl Future + Send rather than async fn so the
returned future carries an explicit Send bound (required by the
hosted server’s Tower/tonic stack) and the trait stays clean under
-D warnings (the async_fn_in_trait lint). This is a sealed
interface — heddle is the sole implementer — so the lint’s
downstream-bound concern does not apply.
Required Associated Types§
Required Methods§
fn read_head(&self) -> Result<Head, Self::Error>
fn write_head(&self, head: &Head) -> Result<(), Self::Error>
fn write_head_cas( &self, expected: RefExpectation<Head>, head: &Head, ) -> Result<(), Self::Error>
fn get_thread( &self, name: &ThreadName, ) -> impl Future<Output = Result<Option<ChangeId>, Self::Error>> + Send
fn set_thread( &self, name: &ThreadName, state: &ChangeId, ) -> Result<(), Self::Error>
fn set_thread_cas( &self, name: &ThreadName, expected: RefExpectation<ChangeId>, state: &ChangeId, ) -> Result<(), Self::Error>
fn delete_thread( &self, name: &ThreadName, ) -> Result<Option<ChangeId>, Self::Error>
fn delete_thread_cas( &self, name: &ThreadName, expected: RefExpectation<ChangeId>, ) -> Result<(), Self::Error>
fn list_threads(&self) -> Result<Vec<ThreadName>, Self::Error>
fn get_marker( &self, name: &MarkerName, ) -> impl Future<Output = Result<Option<ChangeId>, Self::Error>> + Send
fn create_marker( &self, name: &MarkerName, state: &ChangeId, ) -> impl Future<Output = Result<(), Self::Error>> + Send
fn set_marker_cas( &self, name: &MarkerName, expected: RefExpectation<ChangeId>, state: &ChangeId, ) -> Result<(), Self::Error>
fn delete_marker( &self, name: &MarkerName, ) -> Result<Option<ChangeId>, Self::Error>
fn delete_marker_cas( &self, name: &MarkerName, expected: RefExpectation<ChangeId>, ) -> Result<(), Self::Error>
fn list_markers(&self) -> Result<Vec<MarkerName>, Self::Error>
fn update_refs(&self, updates: &[RefUpdate]) -> Result<(), Self::Error>
Provided Methods§
fn resolve( &self, refspec: &str, ) -> impl Future<Output = Result<Option<ChangeId>, Self::Error>> + Send
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".