Files
dusk/tools/csv_to_array/__main__.py
Dominic Masters d1b03c4cb3
Some checks failed
Build Dusk / run-tests (push) Failing after 1m58s
Build Dusk / build-linux (push) Failing after 1m26s
Build Dusk / build-psp (push) Failing after 1m41s
prog
2026-01-26 18:27:12 -06:00

65 lines
2.3 KiB
Python

import argparse
import os
import csv
from tools.util.type import detectType, stringToCType, typeToCType
parser = argparse.ArgumentParser(description="Convert CSV to .h defines")
parser.add_argument("--csv", required=True, help="Path to CSV file")
parser.add_argument("--output", required=True, help="Path to output .h file")
parser.add_argument("--variable", required=True, help="Name of generated array variable")
parser.add_argument('--index-include-path', required=False, default='', help="Include path for index defines")
parser.add_argument('--index-prefix', required=False, default='', help="Prefix for index defines")
parser.add_argument('--index-column', required=True, help="Column name for index values")
parser.add_argument('--data-column', required=True, help="Column name for data values")
args = parser.parse_args()
# Start Header
outHeader = "#pragma once\n"
outHeader += "#include \"dusk.h\"\n"
if args.index_include_path:
outHeader += f'#include "{args.index_include_path}"\n'
outHeader += "\n"
# Read CSV file
with open(args.csv, newline='') as csvfile:
reader = csv.reader(csvfile)
headers = next(reader)
# Ensure both index and data columns exist.
if args.index_column not in headers:
raise ValueError(f"Index column '{args.index_column}' not found in CSV headers")
if args.data_column not in headers:
raise ValueError(f"Data column '{args.data_column}' not found in CSV headers")
# Create key-value pairs from CSV rows.
index_col_idx = headers.index(args.index_column)
data_col_idx = headers.index(args.data_column)
keyValuePairs = {}
valType = None
for row in reader:
key = row[index_col_idx]
value = row[data_col_idx]
# Don't allow duplicate keys.
if key in keyValuePairs:
raise ValueError(f"Duplicate key '{key}' found in CSV")
keyValuePairs[key] = value
if valType is None:
valType = detectType(value)
if valType is None:
valType = 'String'
# Now begin generating header.
cType = typeToCType(valType)
outHeader += f"static const {cType} {args.variable}[] = {{\n"
for key in keyValuePairs:
outHeader += f" [{args.index_prefix}{key}] = "
value = keyValuePairs[key]
outHeader += stringToCType(value)
outHeader += ",\n"
outHeader += "};\n\n"
# Write to output file
with open(args.output, 'w') as outFile:
outFile.write(outHeader)