载入中...
搜索中...
未找到
AttributeSetResourceAccount.cpp
浏览该文件的文档.
51 eve::Diagnostic::error(eve::DiagnosticCode::PreconditionViolation, "resource cost exceeds available balance",
58 eve::Diagnostic::error(eve::DiagnosticCode::NotFound, "resource reservation does not belong to this account",
65 eve::Diagnostic::error(eve::DiagnosticCode::Conflict, "resource reservation belongs to a different account",
83 return eve::Status::failure(eve::StatusCode::Failed, invariantFailure("resource receipt id exhausted", "receipt"));
93AttributeSetResourceAccount::AttributeSetResourceAccount(AttributeSet& attributes) : attributes_(attributes) {
101eve::Result<std::int64_t> AttributeSetResourceAccount::balanceOf(const ResourceId& resource) const {
103 if (!std::isfinite(value) || value < 0.0 || std::floor(value) != value || value > kMaxExactlyRepresentableInteger) {
105 invariantFailure("resource-backed attribute must be a finite non-negative integer", resource.value()));
110eve::Result<std::int64_t> AttributeSetResourceAccount::activeReservationsFor(const ResourceId& resource) const {
128 if (accountNonce_.isZero()) return eve::Result<Affordability>::failure(accountIdentityUnavailableStatus());
140 const std::int64_t available = balance.value() >= reserved.value() ? balance.value() - reserved.value() : 0;
154 eve::DiagnosticCode::Failed, std::string("canAfford") + " failed while staging an atomic candidate",
168 eve::StatusCode::Failed, invariantFailure("resource reservation id exhausted", "reservation")));
171 const auto [it, inserted] = reservations_.emplace(id, ReservationRecord{cost, ReservationState::Active});
174 eve::StatusCode::Conflict, conflict("resource reservation id was already used", "reservation")));
185 eve::DiagnosticCode::Failed, std::string("reserve") + " failed while staging an atomic candidate",
221 eve::DiagnosticCode::Failed, std::string("applyDelta") + " failed while staging an atomic candidate",
239 return eve::Result<Receipt>::success(std::move(receipt), eve::Status::success(eve::StatusCode::Applied));
247 eve::DiagnosticCode::Failed, std::string("debit") + " failed while staging an atomic candidate",
254 if (accountNonce_.isZero()) return eve::Result<Receipt>::failure(accountIdentityUnavailableStatus());
262 eve::StatusCode::Failed, invariantFailure("resource credit overflowed", item.resource.value())));
271 return eve::Result<Receipt>::success(std::move(receipt), eve::Status::success(eve::StatusCode::Applied));
279 eve::DiagnosticCode::Failed, std::string("credit") + " failed while staging an atomic candidate",
317 if (accountNonce_.isZero()) return eve::Result<Receipt>::failure(accountIdentityUnavailableStatus());
319 return eve::Result<Receipt>::failure(invalidArgument("resource reservation is invalid", "reservation"));
320 if (reservation.account != accountNonce_) return eve::Result<Receipt>::failure(foreignReservationStatus());
322 if (it == reservations_.end()) return eve::Result<Receipt>::failure(unknownReservationStatus());
323 if (it->second.cost != reservation.cost) return eve::Result<Receipt>::failure(mismatchedReservationStatus());
332 Receipt receipt{accountNonce_, nextReceipt_, reservation.id, ReceiptOperation::Debit, it->second.cost};
337 return eve::Result<Receipt>::success(std::move(receipt), eve::Status::success(eve::StatusCode::Applied));
345 eve::DiagnosticCode::Failed, std::string("commit") + " failed while staging an atomic candidate",
352 if (accountNonce_.isZero()) return eve::Result<void>::failure(accountIdentityUnavailableStatus());
354 return eve::Result<void>::failure(invalidArgument("resource reservation is invalid", "reservation"));
355 if (reservation.account != accountNonce_) return eve::Result<void>::failure(foreignReservationStatus());
358 if (it->second.cost != reservation.cost) return eve::Result<void>::failure(mismatchedReservationStatus());
370 eve::DiagnosticCode::Failed, std::string("rollback") + " failed while staging an atomic candidate",
Resource-account adapter backed by AttributeSet base values.
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
eve::Result< eve::resource::Affordability > canAfford(const eve::resource::CostSpec &cost) const override
Query whether a cost can be paid from currently available funds.
Definition AttributeSetResourceAccount.cpp:126
eve::Result< eve::resource::Receipt > commit(const eve::resource::Reservation &reservation) override
Commit one active reservation as an atomic debit.
Definition AttributeSetResourceAccount.cpp:315
eve::Result< eve::resource::Receipt > credit(const eve::resource::CostSpec &cost) override
Atomically credit all items immediately.
Definition AttributeSetResourceAccount.cpp:252
eve::Result< void > rollback(const eve::resource::Reservation &reservation) override
Release one active reservation without changing balances.
Definition AttributeSetResourceAccount.cpp:350
eve::Result< eve::resource::Reservation > reserve(const eve::resource::CostSpec &cost) override
Reserve all items of a cost without changing visible balances.
Definition AttributeSetResourceAccount.cpp:159
eve::Result< eve::resource::Receipt > debit(const eve::resource::CostSpec &cost) override
Atomically debit all items immediately.
Definition AttributeSetResourceAccount.cpp:226
AttributeSetResourceAccount(AttributeSet &attributes)
Bind an account adapter to an existing caller-owned AttributeSet.
Definition AttributeSetResourceAccount.cpp:93
Generic owning collection of canonical attributes and modifiers.
Definition AttributeSet.h:160
void setBase(const AttributeId &attribute, double value)
Set or replace a base value. Empty attribute ids are ignored for compatibility.
Definition AttributeSet.cpp:211
double getBase(const AttributeId &attribute, double fallback=0.0) const
Return a base value, or fallback when absent.
Definition AttributeSet.cpp:231
constexpr std::uint64_t value() const noexcept
Returns the underlying value at an explicit protocol boundary.
Definition StrongUint64.h:26
constexpr bool isZero() const noexcept
Whether this nonce is invalid/zero.
Definition ResourceAccount.h:246
Non-negative integral quantity used by resource accounts.
Definition ResourceAccount.h:75
const std::vector< ResourceCost > & items() const noexcept
Return canonical items as a read-only borrowed view.
Definition ResourceAccount.h:185
bool isValid() const noexcept
Whether this value contains a validated non-empty cost.
Definition ResourceAccount.h:175
Strong identity of a resource kind, such as mana or gold.
Definition ResourceAccount.h:40
Definition AttributeProjection.cpp:9
eve::Result< AccountNonce > allocateAccountNonce()
Allocate a process-local account identity for a credential issuer.
Definition ResourceAccount.cpp:27
eve::detail::StrongUint64< eve::detail::ResourceReceiptIdTag > ReceiptId
Process-local id of an applied resource operation.
Definition ResourceAccount.h:261
ReceiptOperation
Operation represented by a receipt returned from an account.
Definition ResourceAccount.h:221
std::vector< DiagnosticDetail > DiagnosticDetails
Owning collection of diagnostic details with stable insertion order.
Definition Diagnostic.h:88
@ InvalidArgument
@ NotFound
@ PreconditionViolation
@ InvariantViolation
@ Failed
@ Conflict
@ NotFound
@ Applied
@ Rejected
@ Failed
@ Conflict
Receipt proving one atomic debit or credit was applied.
Definition ResourceAccount.h:294
Reservation credential returned by a successful reserve operation.
Definition ResourceAccount.h:279