pub struct Location {Show 15 fields
pub id: Uuid,
pub name: String,
pub complete_name: String,
pub active: bool,
pub usage: LocationUsage,
pub location_id: Option<Uuid>,
pub parent_path: String,
pub barcode: Option<String>,
pub warehouse_id: Option<Uuid>,
pub cyclic_inventory_frequency: i32,
pub last_inventory_date: Option<NaiveDate>,
pub next_inventory_date: Option<NaiveDate>,
pub valuation_account_id: Option<Uuid>,
pub storage_category_id: Option<Uuid>,
pub metadata: AuditMetadata,
}Fields§
§id: Uuid§name: String§complete_name: String§active: bool§usage: LocationUsage§location_id: Option<Uuid>§parent_path: String§barcode: Option<String>§warehouse_id: Option<Uuid>§cyclic_inventory_frequency: i32§last_inventory_date: Option<NaiveDate>§next_inventory_date: Option<NaiveDate>§valuation_account_id: Option<Uuid>§storage_category_id: Option<Uuid>§metadata: AuditMetadataImplementations§
Source§impl Location
impl Location
Sourcepub fn builder() -> LocationBuilder
pub fn builder() -> LocationBuilder
Create a builder for Location
Sourcepub fn new(
name: String,
complete_name: String,
active: bool,
usage: LocationUsage,
parent_path: String,
cyclic_inventory_frequency: i32,
) -> Self
pub fn new( name: String, complete_name: String, active: bool, usage: LocationUsage, parent_path: String, cyclic_inventory_frequency: i32, ) -> Self
Create a new Location with required fields
Sourcepub fn typed_id(&self) -> LocationId
pub fn typed_id(&self) -> LocationId
Get a strongly-typed ID for this entity
Sourcepub fn created_at(&self) -> Option<&DateTime<Utc>>
pub fn created_at(&self) -> Option<&DateTime<Utc>>
Get when this entity was created
Sourcepub fn updated_at(&self) -> Option<&DateTime<Utc>>
pub fn updated_at(&self) -> Option<&DateTime<Utc>>
Get when this entity was last updated
Sourcepub fn is_deleted(&self) -> bool
pub fn is_deleted(&self) -> bool
Check if this entity is soft deleted
Sourcepub fn deleted_at(&self) -> Option<&DateTime<Utc>>
pub fn deleted_at(&self) -> Option<&DateTime<Utc>>
Get when this entity was deleted
Sourcepub fn created_by(&self) -> Option<&Uuid>
pub fn created_by(&self) -> Option<&Uuid>
Get who created this entity
Sourcepub fn updated_by(&self) -> Option<&Uuid>
pub fn updated_by(&self) -> Option<&Uuid>
Get who last updated this entity
Sourcepub fn deleted_by(&self) -> Option<&Uuid>
pub fn deleted_by(&self) -> Option<&Uuid>
Get who deleted this entity
Sourcepub fn with_location_id(self, value: Uuid) -> Self
pub fn with_location_id(self, value: Uuid) -> Self
Set the location_id field (chainable)
Sourcepub fn with_barcode(self, value: String) -> Self
pub fn with_barcode(self, value: String) -> Self
Set the barcode field (chainable)
Sourcepub fn with_warehouse_id(self, value: Uuid) -> Self
pub fn with_warehouse_id(self, value: Uuid) -> Self
Set the warehouse_id field (chainable)
Sourcepub fn with_last_inventory_date(self, value: NaiveDate) -> Self
pub fn with_last_inventory_date(self, value: NaiveDate) -> Self
Set the last_inventory_date field (chainable)
Sourcepub fn with_next_inventory_date(self, value: NaiveDate) -> Self
pub fn with_next_inventory_date(self, value: NaiveDate) -> Self
Set the next_inventory_date field (chainable)
Sourcepub fn with_valuation_account_id(self, value: Uuid) -> Self
pub fn with_valuation_account_id(self, value: Uuid) -> Self
Set the valuation_account_id field (chainable)
Sourcepub fn with_storage_category_id(self, value: Uuid) -> Self
pub fn with_storage_category_id(self, value: Uuid) -> Self
Set the storage_category_id field (chainable)
Sourcepub fn apply_patch(&mut self, fields: HashMap<String, Value>)
pub fn apply_patch(&mut self, fields: HashMap<String, Value>)
Apply partial updates from a map of field name to JSON value
Trait Implementations§
Source§impl ApplyUpdateDto<UpdateLocationDto> for Location
impl ApplyUpdateDto<UpdateLocationDto> for Location
fn apply_update(self, dto: UpdateLocationDto) -> ServiceResult<Self>
Source§impl CrudRepository<Location> for LocationRepository
impl CrudRepository<Location> for LocationRepository
Hydrate
?include= relations: fetch rows from table by id list, as JSON
(raw row_to_json). table comes from EntityRepoMeta::relations()
(generator-emitted), never client input. Default: no expansion. The
Postgres-backed generated repos override this via impl_crud_repository!.Source§fn create<'life0, 'async_trait>(
&'life0 self,
entity: Location,
) -> Pin<Box<dyn Future<Output = Result<Location, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn create<'life0, 'async_trait>(
&'life0 self,
entity: Location,
) -> Pin<Box<dyn Future<Output = Result<Location, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Create a new entity
Source§fn find_by_id<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn find_by_id<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Find entity by ID (excluding soft-deleted)
Source§fn find_by_id_including_deleted<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn find_by_id_including_deleted<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Find entity by ID (including soft-deleted, for trash operations)
Source§fn update<'life0, 'async_trait>(
&'life0 self,
entity: Location,
) -> Pin<Box<dyn Future<Output = Result<Location, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn update<'life0, 'async_trait>(
&'life0 self,
entity: Location,
) -> Pin<Box<dyn Future<Output = Result<Location, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Update an existing entity
Source§fn soft_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn soft_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Soft delete an entity
Source§fn restore<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn restore<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Option<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Restore a soft-deleted entity
Source§fn hard_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn hard_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
id: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Permanently delete an entity
Source§fn list<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, u64), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, u64), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
List entities with pagination (excluding soft-deleted)
Source§fn list_filtered<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, u64), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_filtered<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, u64), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
List entities with pagination and filters (excluding soft-deleted) Read more
Source§fn list_filtered_with_info<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, PaginationInfo), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_filtered_with_info<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, PaginationInfo), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
list_filtered, carrying the pagination info (cursor positions
included) so the HTTP layer can surface keyset paging. Default: the
tuple form with the cursor fields absent; the generated Postgres
repositories override this with the real keyset walk.Source§fn table_name(&self) -> Option<&str>
fn table_name(&self) -> Option<&str>
Group and reduce entities under the same filters as
list_filtered. Read morefn aggregate_filtered<'life0, 'life1, 'async_trait>(
&'life0 self,
spec: &'life1 AggregateSpec,
filters: HashMap<String, String>,
) -> Pin<Box<dyn Future<Output = Result<AggregateResult, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn list_deleted<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, u64), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn list_deleted<'life0, 'async_trait>(
&'life0 self,
page: u32,
limit: u32,
) -> Pin<Box<dyn Future<Output = Result<(Vec<Location>, u64), RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
List soft-deleted entities with pagination
Source§fn count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn count<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Count all entities (excluding soft-deleted)
Source§fn count_deleted<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn count_deleted<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Count soft-deleted entities
Source§fn bulk_create<'life0, 'async_trait>(
&'life0 self,
entities: Vec<Location>,
) -> Pin<Box<dyn Future<Output = Result<Vec<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn bulk_create<'life0, 'async_trait>(
&'life0 self,
entities: Vec<Location>,
) -> Pin<Box<dyn Future<Output = Result<Vec<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Bulk create entities
Source§fn empty_trash<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn empty_trash<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Permanently delete all soft-deleted entities
Source§fn bulk_soft_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
ids: &'life1 [String],
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn bulk_soft_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
ids: &'life1 [String],
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Soft-delete many entities by id. Returns the number affected.
Source§fn bulk_restore<'life0, 'life1, 'async_trait>(
&'life0 self,
ids: &'life1 [String],
) -> Pin<Box<dyn Future<Output = Result<Vec<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn bulk_restore<'life0, 'life1, 'async_trait>(
&'life0 self,
ids: &'life1 [String],
) -> Pin<Box<dyn Future<Output = Result<Vec<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Restore many soft-deleted entities by id. Returns the restored entities.
Source§fn bulk_hard_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
ids: &'life1 [String],
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn bulk_hard_delete<'life0, 'life1, 'async_trait>(
&'life0 self,
ids: &'life1 [String],
) -> Pin<Box<dyn Future<Output = Result<u64, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Permanently delete many entities by id. Returns the number affected.
Source§fn restore_all<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn restore_all<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<Vec<Location>, RepositoryError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Restore every soft-deleted entity. Returns the restored entities.
Source§impl<'de> Deserialize<'de> for Location
impl<'de> Deserialize<'de> for Location
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl EntityRepoMeta for Location
impl EntityRepoMeta for Location
Source§fn column_types() -> HashMap<String, String>
fn column_types() -> HashMap<String, String>
PostgreSQL type hints for filter/sort (e.g.
{"id": "uuid"}).Source§fn search_fields() -> &'static [&'static str]
fn search_fields() -> &'static [&'static str]
Text columns to include in full-text / ILIKE search.
Source§fn relations() -> &'static [(&'static str, &'static str, &'static str)]
fn relations() -> &'static [(&'static str, &'static str, &'static str)]
To-one relations expandable via
?include=<name>, as
(relation_name, target_table, local_fk_field) — all response keys
(relation_name/local_fk in camelCase; target_table is the DB table).
Default: none.Source§fn private_fields() -> &'static [&'static str]
fn private_fields() -> &'static [&'static str]
Response fields visible only to the row owner and platform/root callers
(
@private). Stripped for everyone else.Source§fn secret_fields() -> &'static [&'static str]
fn secret_fields() -> &'static [&'static str]
Response fields (camelCase) that never leave the server (
@sensitive): no
caller is served them, a platform caller or the row’s owner included.Source§fn relation_secret_fields(_relation: &str) -> &'static [&'static str]
fn relation_secret_fields(_relation: &str) -> &'static [&'static str]
The
@sensitive fields (camelCase response keys) of the model a to-one
relation points at, stripped from the related row an ?include= expands.
Keyed by the relation name of relations. Default: none.Source§fn owner_field() -> Option<&'static str>
fn owner_field() -> Option<&'static str>
The response field (camelCase) holding the owner/company id (
@owner),
compared against the caller’s access scope to decide private-field
visibility. None = the entity has no owner concept.Source§impl From<&Location> for LocationResponseDto
impl From<&Location> for LocationResponseDto
Source§impl From<CreateLocationDto> for Location
impl From<CreateLocationDto> for Location
Source§fn from(dto: CreateLocationDto) -> Self
fn from(dto: CreateLocationDto) -> Self
Converts to this type from the input type.
Source§impl From<Location> for LocationResponseDto
impl From<Location> for LocationResponseDto
Source§impl From<Location> for LocationSummaryDto
impl From<Location> for LocationSummaryDto
Source§impl FromCreateDto<CreateLocationDto> for Location
impl FromCreateDto<CreateLocationDto> for Location
fn from_create_dto(dto: CreateLocationDto) -> ServiceResult<Self>
Source§impl<'a, R: Row> FromRow<'a, R> for Locationwhere
&'a str: ColumnIndex<R>,
Uuid: Decode<'a, R::Database> + Type<R::Database>,
String: Decode<'a, R::Database> + Type<R::Database>,
bool: Decode<'a, R::Database> + Type<R::Database>,
LocationUsage: Decode<'a, R::Database> + Type<R::Database>,
Option<Uuid>: Decode<'a, R::Database> + Type<R::Database>,
Option<String>: Decode<'a, R::Database> + Type<R::Database>,
i32: Decode<'a, R::Database> + Type<R::Database>,
Option<NaiveDate>: Decode<'a, R::Database> + Type<R::Database>,
Json<AuditMetadata>: Decode<'a, R::Database> + Type<R::Database>,
impl<'a, R: Row> FromRow<'a, R> for Locationwhere
&'a str: ColumnIndex<R>,
Uuid: Decode<'a, R::Database> + Type<R::Database>,
String: Decode<'a, R::Database> + Type<R::Database>,
bool: Decode<'a, R::Database> + Type<R::Database>,
LocationUsage: Decode<'a, R::Database> + Type<R::Database>,
Option<Uuid>: Decode<'a, R::Database> + Type<R::Database>,
Option<String>: Decode<'a, R::Database> + Type<R::Database>,
i32: Decode<'a, R::Database> + Type<R::Database>,
Option<NaiveDate>: Decode<'a, R::Database> + Type<R::Database>,
Json<AuditMetadata>: Decode<'a, R::Database> + Type<R::Database>,
Source§impl PersistentEntity for Location
impl PersistentEntity for Location
Source§fn set_entity_id(&mut self, id: String)
fn set_entity_id(&mut self, id: String)
Set the entity’s unique identifier
Source§fn set_created_at(&mut self, ts: DateTime<Utc>)
fn set_created_at(&mut self, ts: DateTime<Utc>)
Set creation timestamp
Source§fn set_updated_at(&mut self, ts: DateTime<Utc>)
fn set_updated_at(&mut self, ts: DateTime<Utc>)
Set last update timestamp
Source§fn is_deleted(&self) -> bool
fn is_deleted(&self) -> bool
Check if entity is soft-deleted
Source§fn mark_deleted(&mut self)
fn mark_deleted(&mut self)
Mark entity as deleted (soft delete)
Source§fn generate_id() -> String
fn generate_id() -> String
Generate a new ID for this entity type
Source§fn write_protected_fields() -> &'static [&'static str]
fn write_protected_fields() -> &'static [&'static str]
Fields that a generic write (PUT, PATCH and their bulk forms) may not
change, by their serialized name. Read more
Source§impl WriteGuard<Location> for LocationRowRules
impl WriteGuard<Location> for LocationRowRules
Auto Trait Implementations§
impl Freeze for Location
impl RefUnwindSafe for Location
impl Send for Location
impl Sync for Location
impl Unpin for Location
impl UnsafeUnpin for Location
impl UnwindSafe for Location
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more