2020-03-10 13:51:19 -07:00
""" Generate a keymap.c from a configurator export.
"""
import json
from milc import cli
import qmk . keymap
import qmk . path
2020-03-12 11:17:43 -07:00
@cli.argument ( ' -o ' , ' --output ' , arg_only = True , type = qmk . path . normpath , help = ' File to write to ' )
2020-03-10 13:51:19 -07:00
@cli.argument ( ' -q ' , ' --quiet ' , arg_only = True , action = ' store_true ' , help = " Quiet mode, only output error messages " )
2021-02-07 21:02:51 +00:00
@cli.argument ( ' filename ' , type = qmk . path . FileType ( ' r ' ) , arg_only = True , help = ' Configurator JSON file ' )
2020-03-10 13:51:19 -07:00
@cli.subcommand ( ' Creates a keymap.c from a QMK Configurator export. ' )
def json2c ( cli ) :
""" Generate a keymap.c from a configurator export.
This command uses the `qmk.keymap` module to generate a keymap.c from a configurator export. The generated keymap is written to stdout, or to a file if -o is provided.
"""
2020-12-29 20:34:48 +01:00
try :
2021-02-07 21:02:51 +00:00
# Parse the configurator from json file (or stdin)
user_keymap = json . load ( cli . args . filename )
2020-12-29 20:34:48 +01:00
except json . decoder . JSONDecodeError as ex :
cli . log . error ( ' The JSON input does not appear to be valid. ' )
cli . log . error ( ex )
2020-10-07 10:46:10 +11:00
return False
2020-03-10 13:51:19 -07:00
# Environment processing
2020-05-26 17:43:33 +02:00
if cli . args . output and cli . args . output . name == ' - ' :
2020-03-10 13:51:19 -07:00
cli . args . output = None
# Generate the keymap
2020-10-25 14:48:44 -07:00
keymap_c = qmk . keymap . generate_c ( user_keymap [ ' keyboard ' ] , user_keymap [ ' layout ' ] , user_keymap [ ' layers ' ] )
2020-03-10 13:51:19 -07:00
if cli . args . output :
cli . args . output . parent . mkdir ( parents = True , exist_ok = True )
if cli . args . output . exists ( ) :
2021-02-28 20:19:07 +00:00
cli . args . output . replace ( cli . args . output . parent / ( cli . args . output . name + ' .bak ' ) )
2020-03-10 13:51:19 -07:00
cli . args . output . write_text ( keymap_c )
if not cli . args . quiet :
cli . log . info ( ' Wrote keymap to %s . ' , cli . args . output )
else :
print ( keymap_c )