pub struct StateKey {
pub namespace: String,
pub name: String,
}Fields§
§namespace: String§name: StringImplementations§
Source§impl StateKey
impl StateKey
Sourcepub fn new(namespace: impl Into<String>, name: impl Into<String>) -> StateKey
pub fn new(namespace: impl Into<String>, name: impl Into<String>) -> StateKey
Examples found in repository?
examples/phased_boundary.rs (line 13)
11fn grain_pool() -> ReservationPoolKey {
12 ReservationPoolKey::new(
13 StateKey::new("logistics", "grain"),
14 EntityRef::Territory(TerritoryId::new(1)),
15 "grain",
16 )
17}
18
19fn offer_grain(
20 _view: &SimulationView<'_>,
21 _context: &BoundaryContext,
22) -> Result<BoundaryProposal, CanwuError> {
23 Ok(BoundaryProposal {
24 offers: vec![ReservationOffer {
25 pool: grain_pool(),
26 capacity: 10,
27 }],
28 ..BoundaryProposal::default()
29 })
30}
31
32fn request_grain(
33 _view: &SimulationView<'_>,
34 _context: &BoundaryContext,
35) -> Result<BoundaryProposal, CanwuError> {
36 Ok(BoundaryProposal {
37 requests: vec![ReservationRequest {
38 request: "daily-grain".to_owned(),
39 pool: grain_pool(),
40 quantity: 6,
41 priority: 10,
42 tie_break: "western-garrison".to_owned(),
43 }],
44 ..BoundaryProposal::default()
45 })
46}
47
48fn apply_grain(
49 view: &SimulationView<'_>,
50 _context: &BoundaryContext,
51) -> Result<BoundaryProposal, CanwuError> {
52 let reservation = ReservationRef::new("example-demand", "request", "daily-grain");
53 let allocation = view.reservation(&reservation)?.ok_or_else(|| {
54 CanwuError::new(
55 ErrorCode::InvalidBoundary,
56 "the declared grain reservation did not produce allocation evidence",
57 )
58 })?;
59 let territory = EntityRef::Territory(TerritoryId::new(1));
60 Ok(BoundaryProposal {
61 directives: vec![
62 BoundaryDirective::SetComponent {
63 state: StateKey::new("garrison", "grain"),
64 entity: territory.clone(),
65 component: "daily_grant".to_owned(),
66 value: Value::from(allocation.granted),
67 summary: format!(
68 "Granted {} grain to the western garrison",
69 allocation.granted
70 ),
71 },
72 BoundaryDirective::Emit {
73 event_type: "grain_allocated".to_owned(),
74 summary: "The daily grain allocation settled".to_owned(),
75 affected: vec![territory],
76 },
77 ],
78 ..BoundaryProposal::default()
79 })
80}
81
82struct SupplyPlugin;
83
84impl SimulationPlugin for SupplyPlugin {
85 fn name(&self) -> &'static str {
86 "example-supply"
87 }
88
89 fn version(&self) -> &'static str {
90 "1.0.0"
91 }
92
93 fn semantic_hash(&self) -> &'static str {
94 "5fac3fb17e5f6fc4a3c85354908d84405bb569b5816631a91f70b759c156da07"
95 }
96
97 fn register(&self, registrar: &mut canwu_api::PluginRegistrar<'_>) -> Result<(), CanwuError> {
98 let mut contract = BoundarySystemContract::new(
99 "offer",
100 BoundaryPhase::ReservationAndAllocation,
101 SystemCadence::Daily,
102 );
103 contract.reservation_offers = vec![StateKey::new("logistics", "grain")];
104 registrar.register_boundary_system(contract, offer_grain)
105 }
106}
107
108struct DemandPlugin;
109
110impl SimulationPlugin for DemandPlugin {
111 fn name(&self) -> &'static str {
112 "example-demand"
113 }
114
115 fn version(&self) -> &'static str {
116 "1.0.0"
117 }
118
119 fn semantic_hash(&self) -> &'static str {
120 "331b865359d4ac4a14c9bf90da665b82b4aa65ee63c195e331d8f1fa181e7029"
121 }
122
123 fn register(&self, registrar: &mut canwu_api::PluginRegistrar<'_>) -> Result<(), CanwuError> {
124 let mut request = BoundarySystemContract::new(
125 "request",
126 BoundaryPhase::ReservationAndAllocation,
127 SystemCadence::Daily,
128 );
129 request.reservation_requests = vec![StateKey::new("logistics", "grain")];
130 registrar.register_boundary_system(request, request_grain)?;
131
132 let mut apply = BoundarySystemContract::new(
133 "apply",
134 BoundaryPhase::DomainDeltaProposal,
135 SystemCadence::Daily,
136 );
137 apply.writes = vec![StateKey::new("garrison", "grain")];
138 apply.emits = vec!["grain_allocated".to_owned()];
139 apply.reservation_reads = vec![ReservationRef::new(
140 "example-demand",
141 "request",
142 "daily-grain",
143 )];
144 apply.visibility = StateVisibility::SameBoundary;
145 registrar.register_boundary_system(apply, apply_grain)
146 }More examples
examples/plugin.rs (line 35)
11fn set_stance(
12 view: &SimulationView<'_>,
13 context: &CommandContext,
14 payload: &Value,
15) -> Result<Vec<SystemDirective>, CanwuError> {
16 let army = ArmyId::new(
17 payload
18 .get("army")
19 .and_then(Value::as_u64)
20 .expect("payload was validated before the handler ran"),
21 );
22 let Some(army_state) = view.army(army)? else {
23 return Err(CanwuError::new(
24 ErrorCode::ArmyNotFound,
25 format!("army {army} was not found"),
26 ));
27 };
28 if context.issuer != Issuer::Actor(army_state.commander) {
29 return Err(CanwuError::new(
30 ErrorCode::InvalidAuthority,
31 "only the army commander may set its stance",
32 ));
33 }
34 Ok(vec![SystemDirective::SetComponent {
35 state: StateKey::new("military", "stance"),
36 entity: EntityRef::Army(army),
37 component: "stance".to_owned(),
38 value: payload["stance"].clone(),
39 summary: format!("Army {army} changed stance"),
40 }])
41}
42
43impl SimulationPlugin for StancePlugin {
44 fn name(&self) -> &'static str {
45 "example-stance"
46 }
47
48 fn version(&self) -> &'static str {
49 "1.0.0"
50 }
51
52 fn semantic_hash(&self) -> &'static str {
53 "a33fb7c59ae5a17685bd94f99154c5423dc7bf70d3dbde6ef4daf73670a37d26"
54 }
55
56 fn register(&self, registrar: &mut PluginRegistrar<'_>) -> Result<(), CanwuError> {
57 registrar.register_command(
58 PluginActionDescriptor {
59 name: "set_stance".to_owned(),
60 description: "Set an army stance through an issuer-aware command".to_owned(),
61 payload_schema: PayloadSchema::Object {
62 properties: BTreeMap::from([
63 (
64 "army".to_owned(),
65 PayloadProperty {
66 value_type: PayloadValueType::Integer,
67 required: true,
68 },
69 ),
70 (
71 "stance".to_owned(),
72 PayloadProperty {
73 value_type: PayloadValueType::String,
74 required: true,
75 },
76 ),
77 ]),
78 allow_additional: false,
79 },
80 reads: vec![StateKey::core_armies()],
81 writes: vec![StateKey::new("military", "stance")],
82 },
83 set_stance,
84 )
85 }pub fn core_people() -> StateKey
pub fn core_governments() -> StateKey
pub fn core_territories() -> StateKey
pub fn core_routes() -> StateKey
Sourcepub fn core_armies() -> StateKey
pub fn core_armies() -> StateKey
Examples found in repository?
examples/plugin.rs (line 80)
56 fn register(&self, registrar: &mut PluginRegistrar<'_>) -> Result<(), CanwuError> {
57 registrar.register_command(
58 PluginActionDescriptor {
59 name: "set_stance".to_owned(),
60 description: "Set an army stance through an issuer-aware command".to_owned(),
61 payload_schema: PayloadSchema::Object {
62 properties: BTreeMap::from([
63 (
64 "army".to_owned(),
65 PayloadProperty {
66 value_type: PayloadValueType::Integer,
67 required: true,
68 },
69 ),
70 (
71 "stance".to_owned(),
72 PayloadProperty {
73 value_type: PayloadValueType::String,
74 required: true,
75 },
76 ),
77 ]),
78 allow_additional: false,
79 },
80 reads: vec![StateKey::core_armies()],
81 writes: vec![StateKey::new("military", "stance")],
82 },
83 set_stance,
84 )
85 }pub fn core_knowledge() -> StateKey
pub fn core_commands() -> StateKey
pub fn core_events() -> StateKey
Sourcepub fn core_ingress() -> StateKey
pub fn core_ingress() -> StateKey
Examples found in repository?
examples/governance_transition.rs (line 449)
427 fn register(&self, registrar: &mut PluginRegistrar<'_>) -> Result<(), CanwuError> {
428 let mut schema = DomainRecordSchema::for_record::<ReliefOrderRecord>();
429 schema.payload_schema = object_schema(&[
430 ("order_id", PayloadValueType::String),
431 ("issued_by", PayloadValueType::String),
432 ("treasury_system", PayloadValueType::String),
433 ("treasury_version", PayloadValueType::Integer),
434 ("treasury_disposition", PayloadValueType::String),
435 ("treasury_hash", PayloadValueType::String),
436 ("county_system", PayloadValueType::String),
437 ("county_version", PayloadValueType::Integer),
438 ("county_disposition", PayloadValueType::String),
439 ("county_hash", PayloadValueType::String),
440 ]);
441 registrar.register_record_schema(schema)?;
442 registrar.register_ingress(issue_descriptor())?;
443
444 let mut publish = BoundarySystemContract::new(
445 "publish-order",
446 BoundaryPhase::DomainDeltaProposal,
447 SystemCadence::EventDriven,
448 );
449 publish.reads = vec![order_state(), StateKey::core_ingress()];
450 publish.writes = vec![order_state()];
451 publish.plugin_ingress_targets = vec![
452 canwu_api::PluginIngressTarget {
453 target_plugin: TREASURY_PLUGIN.to_owned(),
454 packet_type: EXECUTE_INGRESS.to_owned(),
455 },
456 canwu_api::PluginIngressTarget {
457 target_plugin: COUNTY_PLUGIN.to_owned(),
458 packet_type: EXECUTE_INGRESS.to_owned(),
459 },
460 ];
461 publish.visibility = StateVisibility::SameBoundary;
462 registrar.register_boundary_system(publish, publish_order)?;
463
464 let mut audit = BoundarySystemContract::new(
465 "audit-order",
466 BoundaryPhase::StrategicAggregation,
467 SystemCadence::EventDriven,
468 );
469 audit.reads = vec![
470 order_state(),
471 treasury_state(),
472 county_state(),
473 StateKey::core_ingress(),
474 ];
475 registrar.register_boundary_system(audit, audit_order)
476 }
477}
478
479struct TreasuryPlugin;
480
481impl SimulationPlugin for TreasuryPlugin {
482 fn name(&self) -> &'static str {
483 TREASURY_PLUGIN
484 }
485
486 fn version(&self) -> &'static str {
487 "1"
488 }
489
490 fn semantic_hash(&self) -> &'static str {
491 "0000000000000000000000000000000000000000000000000000000000000302"
492 }
493
494 fn register(&self, registrar: &mut PluginRegistrar<'_>) -> Result<(), CanwuError> {
495 let mut schema = DomainRecordSchema::for_entity::<TreasuryActionRecord>();
496 schema.payload_schema = object_schema(&[
497 ("status", PayloadValueType::String),
498 ("grain_units", PayloadValueType::Integer),
499 ]);
500 registrar.register_record_schema(schema)?;
501 registrar.register_ingress(execute_descriptor())?;
502 let mut prepare = BoundarySystemContract::new(
503 "prepare-treasury",
504 BoundaryPhase::HistoricalCandidateEvaluation,
505 SystemCadence::EventDriven,
506 );
507 prepare.reads = vec![order_state(), StateKey::core_ingress()];
508 prepare.writes = vec![treasury_state()];
509 prepare.visibility = StateVisibility::SameBoundary;
510 registrar.register_boundary_system(prepare, prepare_treasury)
511 }
512}
513
514struct CountyPlugin;
515
516impl SimulationPlugin for CountyPlugin {
517 fn name(&self) -> &'static str {
518 COUNTY_PLUGIN
519 }
520
521 fn version(&self) -> &'static str {
522 "1"
523 }
524
525 fn semantic_hash(&self) -> &'static str {
526 "0000000000000000000000000000000000000000000000000000000000000303"
527 }
528
529 fn register(&self, registrar: &mut PluginRegistrar<'_>) -> Result<(), CanwuError> {
530 let mut schema = DomainRecordSchema::for_entity::<CountyActionRecord>();
531 schema.payload_schema = object_schema(&[
532 ("status", PayloadValueType::String),
533 ("grain_units", PayloadValueType::Integer),
534 ]);
535 registrar.register_record_schema(schema)?;
536 registrar.register_ingress(execute_descriptor())?;
537 let mut prepare = BoundarySystemContract::new(
538 "prepare-county",
539 BoundaryPhase::HistoricalCandidateEvaluation,
540 SystemCadence::EventDriven,
541 );
542 prepare.reads = vec![order_state(), StateKey::core_ingress()];
543 prepare.writes = vec![county_state()];
544 prepare.visibility = StateVisibility::SameBoundary;
545 registrar.register_boundary_system(prepare, prepare_county)
546 }Sourcepub fn core_decisions() -> StateKey
pub fn core_decisions() -> StateKey
Current decision controllers, tickets, and request outcomes.
Sourcepub fn core_domain_records() -> StateKey
pub fn core_domain_records() -> StateKey
Administrative read access to current plugin-owned domain records.
Sourcepub fn core_evidence() -> StateKey
pub fn core_evidence() -> StateKey
Retained or archived boundary and random-draw evidence identities.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for StateKey
impl<'de> Deserialize<'de> for StateKey
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<StateKey, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<StateKey, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl Eq for StateKey
Source§impl Ord for StateKey
impl Ord for StateKey
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the minimum of two values. Read more
Source§impl PartialOrd for StateKey
impl PartialOrd for StateKey
Source§impl Serialize for StateKey
impl Serialize for StateKey
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Serialize this value into the given Serde serializer. Read more
impl StructuralPartialEq for StateKey
Auto Trait Implementations§
impl Freeze for StateKey
impl RefUnwindSafe for StateKey
impl Send for StateKey
impl Sync for StateKey
impl Unpin for StateKey
impl UnsafeUnpin for StateKey
impl UnwindSafe for StateKey
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