#!/usr/bin/env python3.8

# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# A tool for autogenerating the mapping between Status and zx_status_t
# Usage: python gen_status.py zircon/system/public/zircon/errors.h {sys,enum,match}
import re
import sys

status_re = re.compile('#define\s+(ZX_\w+)\s+\((\-?\d+)\)$')


def parse(in_filename):
    result = []
    for line in file(in_filename):
        m = status_re.match(line)
        if m:
            result.append((m.group(1), int(m.group(2))))
    return result


def to_snake_case(name):
    result = []
    for element in name.split('_'):
        result.append(element[0] + element[1:].lower())
    return ''.join(result)


def out(style, l):
    print('// Auto-generated using tools/gen_status.py')
    longest = max(len(name) for (name, num) in l)
    if style == 'sys':
        for (name, num) in l:
            print(
                'pub const %s : zx_status_t = %d;' % (name.ljust(longest), num))
    if style == 'enum':
        print('pub enum Status {')
        for (name, num) in l:
            print('    %s = %d,' % (to_snake_case(name[3:]), num))
        print('')
        print(
            '    /// Any zx_status_t not in the set above will map to the following:'
        )
        print('    UnknownOther = -32768,')
        print('}')
    if style == 'match':
        for (name, num) in l:
            print(
                '            sys::%s => Status::%s,' %
                (name, to_snake_case(name[3:])))
        print('            _ => Status::UnknownOther,')


l = parse(sys.argv[1])
out(sys.argv[2], l)
