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?
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
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 }Sourcepub fn core_people() -> StateKey
pub fn core_people() -> StateKey
Core legacy person records. A phase-7 boundary system that declares
this key as a write may propose BoundaryDirective::CreatePerson.
Sourcepub fn core_person_availability() -> StateKey
pub fn core_person_availability() -> StateKey
Core person life and custody state. A phase-7 or phase-10 boundary
system that declares this key as a write may propose
BoundaryDirective::SetPersonAvailability.
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?
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?
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.
Sourcepub fn core_transitions() -> StateKey
pub fn core_transitions() -> StateKey
Pending transition manifests and the transition audits of the current
boundary. A phase-7, phase-10, or phase-12 boundary system that
declares this key as a write may propose
BoundaryDirective::RegisterTransitionManifest; a phase-10 system that
declares it may propose BoundaryDirective::StageTransitionWrite.
Reading manifests or audits requires declaring it as a read, and a
reader sees only those its plugin coordinates or participates in.