1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//! The sms port (hand-written; user-owned; see
//! `metaphor.codegen.yaml`).
//!
//! The SMS arm of the scheduler (ESM-1/ESM-2): a scheduler row whose
//! derived channel is `sms` renders through the SAME host-installed
//! `EventTemplateRenderer` port (the renderer receives the row's
//! template_kind and returns the body; the sms arm reads `body_text`)
//! and enqueues through THIS port with the registration's PHONE as
//! the recipient.
//!
//! The refusing default is the DECLARED posture of an unconfigured
//! gateway: every enqueue refuses, the scheduler records the typed
//! `sms_enqueue_refused` failure, the receipt stays unsent, and the
//! row parks LOUDLY — parked is never silently queued, and never a
//! registration blocker (ESM-2). The module owns no SMS transport;
//! the host composes mail's gateway-sms-http adapter (or any other)
//! behind this trait at mount time.
//!
//! Process-local trait (not HTTP) — same composition discipline as
//! EventMailQueue.
use async_trait;
/// The rendered outbound sms body. The renderer port returns its mail
/// shape; the sms arm reads `body_text` from it, so this view is just
/// that arm — kept as its own type so the queue port speaks sms, not
/// half a mail.
/// The sms enqueue seam. A successful enqueue is `'sent' = queued`
/// (the same contract as the mail arm — EBB-3 holds on both arms).
/// The refusing default: an unconfigured gateway is a typed, LOUD
/// failure — `sms_enqueue_refused` recorded on the scheduler row, the
/// receipt retried on the next pass, never silently queued.
;