96 lines
2.4 KiB
Rust
96 lines
2.4 KiB
Rust
// Copyright © 2022 The Radicle Link Contributors
|
|
//
|
|
// This file is part of radicle-link, distributed under the GPLv3 with Radicle
|
|
// Linking Exception. For full terms see the included LICENSE file.
|
|
|
|
use std::{convert::TryFrom as _, fmt, str::FromStr};
|
|
|
|
use git_ext::Oid;
|
|
use git_ref_format::{Component, RefString};
|
|
use serde::{Deserialize, Serialize};
|
|
use thiserror::Error;
|
|
|
|
pub mod collaboration;
|
|
pub use collaboration::{create, get, info, list, update, CollaborativeObject, Create, Update};
|
|
|
|
pub mod storage;
|
|
pub use storage::{Commit, Objects, Reference, Storage};
|
|
|
|
#[derive(Debug, Error)]
|
|
pub enum ParseObjectId {
|
|
#[error(transparent)]
|
|
Git(#[from] git2::Error),
|
|
}
|
|
|
|
/// The id of an object
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
|
pub struct ObjectId(Oid);
|
|
|
|
impl FromStr for ObjectId {
|
|
type Err = ParseObjectId;
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
let oid = Oid::try_from(s.as_bytes())?;
|
|
Ok(ObjectId(oid))
|
|
}
|
|
}
|
|
|
|
impl From<Oid> for ObjectId {
|
|
fn from(oid: Oid) -> Self {
|
|
ObjectId(oid)
|
|
}
|
|
}
|
|
|
|
impl From<&Oid> for ObjectId {
|
|
fn from(oid: &Oid) -> Self {
|
|
(*oid).into()
|
|
}
|
|
}
|
|
|
|
impl From<git2::Oid> for ObjectId {
|
|
fn from(oid: git2::Oid) -> Self {
|
|
Oid::from(oid).into()
|
|
}
|
|
}
|
|
|
|
impl From<&git2::Oid> for ObjectId {
|
|
fn from(oid: &git2::Oid) -> Self {
|
|
ObjectId(Oid::from(*oid))
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for ObjectId {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{}", self.0)
|
|
}
|
|
}
|
|
|
|
impl Serialize for ObjectId {
|
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
where
|
|
S: serde::Serializer,
|
|
{
|
|
serializer.serialize_bytes(self.0.as_bytes())
|
|
}
|
|
}
|
|
|
|
impl<'de> Deserialize<'de> for ObjectId {
|
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
where
|
|
D: serde::Deserializer<'de>,
|
|
{
|
|
let raw = <&[u8]>::deserialize(deserializer)?;
|
|
let oid = Oid::try_from(raw).map_err(serde::de::Error::custom)?;
|
|
Ok(ObjectId(oid))
|
|
}
|
|
}
|
|
|
|
impl From<&ObjectId> for Component<'_> {
|
|
fn from(id: &ObjectId) -> Self {
|
|
let refstr = RefString::try_from(id.0.to_string())
|
|
.expect("collaborative object id's are valid ref strings");
|
|
Component::from_refstring(refstr)
|
|
.expect("collaborative object id's are valid refname components")
|
|
}
|
|
}
|