Struct VersionedFileService

Source
pub struct VersionedFileService { /* private fields */ }
Expand description

Service for managing versioned files with Git version control.

VersionedFileService provides high-level operations for working with Git repositories in VPR’s patient record system. It handles atomic file write and commit operations with automatic rollback on failure, ensuring data consistency and integrity.

The service supports both signed commits (using ECDSA P-256 with X.509 certificates) and unsigned commits. All commits use structured [VprCommitMessage] format for consistency and auditability.

§Core Capabilities

  • Atomic Operations: Write multiple files and commit in a single transaction
  • Automatic Rollback: Restore previous state if any operation fails
  • Directory Creation: Automatically create parent directories as needed
  • Signed Commits: Optional cryptographic signing with X.509 certificates
  • Signature Verification: Verify commit signatures for audit purposes

§Usage Pattern

The typical workflow is:

  1. Create or open a repository with init or open
  2. Prepare file changes using FileToWrite structs
  3. Write and commit files with write_and_commit_files
  4. Optionally verify signatures with verify_commit_signature

Implementations§

Source§

impl VersionedFileService

Source

pub fn verify_commit_signature( base_dir: &Path, uuid: &str, public_key_pem: &str, ) -> PatientResult<bool>

Verifies the ECDSA signature of the latest commit in a patient’s Git repository.

VPR uses git2::Repository::commit_signed with an ECDSA P-256 signature over the unsigned commit buffer produced by commit_create_buffer.

The signature, signing public key, and optional X.509 certificate are embedded directly in the commit object’s gpgsig header as a base64-encoded JSON container.

This method reconstructs the commit buffer and verifies the signature using the embedded public key, optionally checking that public_key_pem (if provided) matches it.

§Arguments
  • base_dir - The base directory for the patient records (e.g., clinical or demographics directory).
  • uuid - The UUID of the patient record as a string.
  • public_key_pem - The PEM-encoded public key used for verification.
§Returns

Returns true if the signature is valid, false otherwise.

§Errors

Returns a PatientError if:

  • the UUID cannot be parsed,
  • the Git repository cannot be opened or the latest commit cannot be read,
  • public_key_pem is provided but cannot be parsed as a public key or X.509 certificate.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more