// File: chen3feng[P]error-handling/result.cpp
// Function: main
int main() {
    auto r = GetIntFromFile("bad");
    if (r.Error()) {
        std::cout
            << "In " << r.Error().File() << ":" << r.Error().Line() << ":" << r.Error().Function()
            << " Code: " << r.Error().Code() << '\n';
    }
    std::cout << r.ValueOr(-1) << '\n';
    std::cout << GetIntFromFile("number").Value() << '\n';

    // 可以显式地忽略错误，如果不加这个，Result 定义上的 [[nodiscard]] 属性会导致编译器警告，提醒开发者。
    FlushAll().IgnoreError();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x170, %rsp            # imm = 0x170
movl $0x0, -0x4(%rbp)
leaq -0x41(%rbp), %rdi
movq %rdi, -0xb0(%rbp)
callq 0x2280
movq -0xb0(%rbp), %rdx
leaq 0x425f(%rip), %rsi      # 0x700f
leaq -0x40(%rbp), %rdi
callq 0x3b60
jmp 0x2dbb
leaq -0x20(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x2870
jmp 0x2dca
leaq -0x40(%rbp), %rdi
callq 0x20e0
leaq -0x41(%rbp), %rdi
callq 0x21b0
leaq -0x20(%rbp), %rdi
callq 0x3c10
movq %rax, -0xb8(%rbp)
jmp 0x2dee
movq -0xb8(%rbp), %rdi
callq 0x3c30
movb %al, -0xb9(%rbp)
jmp 0x2e02
movb -0xb9(%rbp), %al
testb $0x1, %al
jne 0x2e11
jmp 0x2fe0
movq 0x91c0(%rip), %rdi      # 0xbfd8
leaq 0x4217(%rip), %rsi      # 0x7036
callq 0x2160
movq %rax, -0xc8(%rbp)
jmp 0x2e2d
leaq -0x20(%rbp), %rdi
callq 0x3c10
movq %rax, -0xd0(%rbp)
jmp 0x2e3f
movq -0xd0(%rbp), %rdi
callq 0x3c80
movq %rax, -0xd8(%rbp)
jmp 0x2e54
movq -0xd8(%rbp), %rsi
movq -0xc8(%rbp), %rdi
callq 0x2160
movq %rax, -0xe0(%rbp)
jmp 0x2e70
movq -0xe0(%rbp), %rdi
leaq 0x41bc(%rip), %rsi      # 0x703a
callq 0x2160
movq %rax, -0xe8(%rbp)
jmp 0x2e8c
leaq -0x20(%rbp), %rdi
callq 0x3c10
movq %rax, -0xf0(%rbp)
jmp 0x2e9e
movq -0xf0(%rbp), %rdi
callq 0x3cb0
movl %eax, -0xf4(%rbp)
jmp 0x2eb2
movl -0xf4(%rbp), %esi
movq -0xe8(%rbp), %rdi
callq 0x2260
movq %rax, -0x100(%rbp)
jmp 0x2ecd
movq -0x100(%rbp), %rdi
leaq 0x415f(%rip), %rsi      # 0x703a
callq 0x2160
movq %rax, -0x108(%rbp)
jmp 0x2ee9
leaq -0x20(%rbp), %rdi
callq 0x3c10
movq %rax, -0x110(%rbp)
jmp 0x2efb
movq -0x110(%rbp), %rdi
callq 0x3ce0
movq %rax, -0x118(%rbp)
jmp 0x2f10
movq -0x118(%rbp), %rsi
movq -0x108(%rbp), %rdi
callq 0x2160
movq %rax, -0x120(%rbp)
jmp 0x2f2c
movq -0x120(%rbp), %rdi
leaq 0x4102(%rip), %rsi      # 0x703c
callq 0x2160
movq %rax, -0x128(%rbp)
jmp 0x2f48
leaq -0x20(%rbp), %rdi
callq 0x3c10
movq %rax, -0x130(%rbp)
jmp 0x2f5a
movq -0x130(%rbp), %rdi
callq 0x3d10
movl %eax, -0x134(%rbp)
jmp 0x2f6e
movl -0x134(%rbp), %esi
movq -0x128(%rbp), %rdi
callq 0x2260
movq %rax, -0x140(%rbp)
jmp 0x2f89
movq -0x140(%rbp), %rdi
movl $0xa, %esi
callq 0x21e0
jmp 0x2f9c
jmp 0x2fe0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x2fc1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x20e0
leaq -0x41(%rbp), %rdi
callq 0x21b0
jmp 0x3172
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x3169
leaq -0x20(%rbp), %rdi
movl $0xffffffff, %esi       # imm = 0xFFFFFFFF
callq 0x3d30
movl %eax, -0x144(%rbp)
jmp 0x2ff6
movl -0x144(%rbp), %esi
movq 0x8fd5(%rip), %rdi      # 0xbfd8
callq 0x2260
movq %rax, -0x150(%rbp)
jmp 0x3011
movq -0x150(%rbp), %rdi
movl $0xa, %esi
callq 0x21e0
jmp 0x3024
leaq -0x91(%rbp), %rdi
movq %rdi, -0x158(%rbp)
callq 0x2280
movq -0x158(%rbp), %rdx
leaq 0x3fbf(%rip), %rsi      # 0x7004
leaq -0x90(%rbp), %rdi
callq 0x3b60
jmp 0x3053
leaq -0x70(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x2870
jmp 0x3065
leaq -0x70(%rbp), %rdi
callq 0x3d80
movq %rax, -0x160(%rbp)
jmp 0x3077
movq -0x160(%rbp), %rax
movl (%rax), %esi
movq 0x8f51(%rip), %rdi      # 0xbfd8
callq 0x2260
movq %rax, -0x168(%rbp)
jmp 0x3095
movq -0x168(%rbp), %rdi
movl $0xa, %esi
callq 0x21e0
jmp 0x30a8
leaq -0x70(%rbp), %rdi
callq 0x3d90
leaq -0x90(%rbp), %rdi
callq 0x20e0
leaq -0x91(%rbp), %rdi
callq 0x21b0
leaq -0xa8(%rbp), %rdi
callq 0x2d50
jmp 0x30d7
leaq -0xa8(%rbp), %rdi
callq 0x3de0
jmp 0x30e5
leaq -0xa8(%rbp), %rdi
callq 0x3df0
leaq -0x20(%rbp), %rdi
callq 0x3d90
movl -0x4(%rbp), %eax
addq $0x170, %rsp            # imm = 0x170
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x3143
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x3137
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x3d90
leaq -0x90(%rbp), %rdi
callq 0x20e0
leaq -0x91(%rbp), %rdi
callq 0x21b0
jmp 0x3169
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0xa8(%rbp), %rdi
callq 0x3df0
leaq -0x20(%rbp), %rdi
callq 0x3d90
movq -0x50(%rbp), %rdi
callq 0x2270
nopl (%rax,%rax)