Skip to main content

LeaseFile

Enum LeaseFile 

Source
pub enum LeaseFile {
    Absent,
    Empty,
    Corrupt(String),
    Document(LeaseDocument),
}
Expand description

What a lease file holds, read once. Every state of the file is a variant, so that a reader decides what to do about each rather than learning it from an error.

use majordomus_cli::lease::LeaseFile;
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("server.json");
assert_eq!(LeaseFile::read(&path), LeaseFile::Absent);
assert!(LeaseFile::read(&path).document().is_none(), "no document to hand back");

Variants§

§

Absent

There is no file.

§

Empty

A file with nothing in it: its owner created it and has not written it yet.

§

Corrupt(String)

A file that is not a lease document; the reason, for the log.

§

Document(LeaseDocument)

A lease document.

Implementations§

Source§

impl LeaseFile

Source

pub fn read(path: &Path) -> LeaseFile

Read and type the file at path. Never fails: every state of the file is one of the variants, and what to do about each is the reader’s decision.

use majordomus_cli::lease::{LeaseFile, SCHEMA};
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("server.json");
assert_eq!(LeaseFile::read(&path), LeaseFile::Absent);
std::fs::write(&path, "").unwrap();
assert_eq!(LeaseFile::read(&path), LeaseFile::Empty);
std::fs::write(&path, "{not json").unwrap();
assert!(matches!(LeaseFile::read(&path), LeaseFile::Corrupt(r) if r.starts_with("not JSON")));
std::fs::write(&path, r#"{"schema":"other/v1"}"#).unwrap();
assert!(matches!(LeaseFile::read(&path), LeaseFile::Corrupt(r) if r.contains(SCHEMA)));
std::fs::write(&path, format!(r#"{{"schema":"{SCHEMA}","token":"x","root":"/r","url":null}}"#)).unwrap();
match LeaseFile::read(&path) {
    LeaseFile::Document(d) => { assert_eq!(d.token, "x"); assert!(d.url.is_none()); assert!(d.version.is_none()); }
    other => panic!("{other:?}"),
}
Source

pub fn document(&self) -> Option<&LeaseDocument>

The document, when the file holds one; None for an absent, empty or corrupt file, for a reader that has no different answer for those three.

use majordomus_cli::lease::{LeaseDocument, LeaseFile, SCHEMA};
let doc = LeaseDocument {
    schema: SCHEMA.into(), pid: 7, token: "t".into(), root: "/r".into(), url: None,
    started_at: "2026-09-10T00:00:00Z".into(), executable: None, version: None,
};
assert_eq!(LeaseFile::Document(doc.clone()).document(), Some(&doc));
assert_eq!(LeaseFile::Corrupt("not JSON".into()).document(), None);

Trait Implementations§

Source§

impl Clone for LeaseFile

Source§

fn clone(&self) -> LeaseFile

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LeaseFile

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for LeaseFile

Source§

impl PartialEq for LeaseFile

Source§

fn eq(&self, other: &LeaseFile) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for LeaseFile

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
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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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.

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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<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