Allow coercing a type in vimspector config

Initially I considered using #i, #s, etc. to coerce to specific types,
but then it wasn't clear of the semantics (particularly for bool, where
JSON bool true/false, Python bool True/False).

But it turns out that we can just coerce any key from a JSON string.
Users can _probably_ type JSON strings for most things, or use variables
to run scripts to generate them, this allows essentially complete
flexibility to define the data types needed to populate the launch spec.

The purpose of this is to allow some level of automated setup by
requesting data from the user and then (subsequently) saving the
flattneed config to the vimspector config file.
This commit is contained in:
Ben Jackson 2020-08-05 22:19:38 +01:00
commit be44a22903
2 changed files with 26 additions and 4 deletions

View file

@ -24,6 +24,7 @@ import subprocess
import shlex
import collections
import re
import typing
LOG_FILE = os.path.expanduser( os.path.join( '~', '.vimspector.log' ) )
@ -540,14 +541,30 @@ def ExpandReferencesInString( orig_s,
return s
def CoerceType( mapping: typing.Dict[ str, typing.Any ], key: str ):
DICT_TYPES = {
'json': json.loads,
}
parts = key.split( '#' )
if len( parts ) > 1 and parts[ -1 ] in DICT_TYPES.keys():
value = mapping.pop( key )
new_type = parts[ -1 ]
key = '#'.join( parts[ 0 : -1 ] )
mapping[ key ] = DICT_TYPES[ new_type ]( value )
# TODO: Should we just run the substitution on the whole JSON string instead?
# That woul dallow expansion in bool and number values, such as ports etc. ?
def ExpandReferencesInDict( obj, mapping, calculus, user_choices ):
for k in obj.keys():
for k in list( obj.keys() ):
obj[ k ] = ExpandReferencesInObject( obj[ k ],
mapping,
calculus,
user_choices )
CoerceType( obj, k )
def ParseVariables( variables_list,
@ -560,9 +577,10 @@ def ParseVariables( variables_list,
if not isinstance( variables_list, list ):
variables_list = [ variables_list ]
variables: typing.Dict[ str, typing.Any ]
for variables in variables_list:
new_mapping.update( new_variables )
for n, v in variables.items():
for n, v in list( variables.items() ):
if isinstance( v, dict ):
if 'shell' in v:
new_v = v.copy()
@ -597,6 +615,8 @@ def ParseVariables( variables_list,
calculus,
user_choices )
CoerceType( new_variables, n )
return new_variables