// 07. exported surface만 모은 파일 — interface artifact가 담아야 할 것 // // 이 파일에 보이는 것 전부가 interface hash 입력이고, // downstream이 검사에 쓰는 정보 전부다. 본문은 하나도 필요 없다. pub capability PaymentGateway { fn refund(id: OrderId) effects {PaymentGateway.refund} -> Result fn charge(id: OrderId, amount: Money) effects {PaymentGateway.charge} -> Result } // 타입 정의 본문 (exhaustiveness에 직결하므로 variant까지 전부) pub enum PayError { Declined(Code), Network(Retryable), Fraud, } // affinity는 유도되지만 표기된다: 필드에 affine이 없으므로 copyable pub copyable struct Receipt { id: ReceiptId, amount: Money, } // File을 필드로 가지므로 전이적으로 affine (선언하지 않아도 유도됨) pub struct AuditLog { sink: File, name: String, } // exported constant는 타입과 값이 모두 hash 입력 pub const MAX_RETRIES: Int = 3 // 함수는 시그니처만. 본문은 hash에 들어가지 않는다. pub fn refund_order( use pay: PaymentGateway, id: OrderId, ) effects {PaymentGateway.refund} -> Result pub fn retry_budget() -> Int