// 04. enum 정의 본문이 interface surface에 들어가는 이유 // // variant 추가가 downstream exhaustive match를 깨뜨리는 경로. pub enum PayError { Declined(Code), Network(Retryable), Fraud, } pub copyable struct Receipt { id: ReceiptId, amount: Money, } // exhaustive match. PayError에 variant가 추가되면 여기가 compile error가 된다. pub fn is_retryable(e: PayError) -> Bool { match e { Declined(_) => false, Network(r) => r.retryable, Fraud => false, } } pub fn describe(e: PayError) -> String { match e { Declined(code) => String.concat("declined: ", Code.show(code)), Network(_) => "network", Fraud => "fraud", } } // 재수출. hash 입력은 이름 목록이 아니라 해소된 정의 본문이다. // 전용 키워드를 쓴다 — "처음 내보내기"와 의미가 다르고, hash 전파를 동반한다. reexport PayError reexport Receipt