in azure/Kqlmagic/parser.py [0:0]
def parse_and_get_kv_string(cls, conn_str:str, user_ns:Dict[str,Any], keep_original_key:bool=None)->Dict[str,Any]:
rest = conn_str
rest = rest.strip()
_was_quoted, rest = strip_if_quoted(rest)
matched_kv = {}
delimiter_required = False
lp_idx = rest.find("(")
eq_idx = rest.find("=")
sc_idx = rest.find(";")
l_char = "(" if eq_idx < 0 and sc_idx < 0 else "=" if lp_idx < 0 else "(" if lp_idx < eq_idx and lp_idx < sc_idx else "="
r_char = ")" if l_char == "(" else ";"
extra_delimiter = None if r_char == ";" else "."
while len(rest) > 0:
l_idx = rest.find(l_char)
r_idx = rest.find(r_char)
if l_idx < 0:
if l_char == "(":
# string ends with delimiter
if extra_delimiter is not None and extra_delimiter == rest:
break
else:
raise ValueError("invalid key/value string, missing left parethesis.")
# key only at end of string
elif r_idx < 0:
key = rest
val = ""
rest = ""
# key only
else:
key = rest[:r_idx].strip()
val = ""
rest = rest[r_idx + 1:].strip()
# key only
elif r_idx >= 0 and r_idx < l_idx:
if l_char == "(":
raise ValueError("invalid key/value string, missing left parethesis.")
else:
key = rest[:r_idx].strip()
val = ""
rest = rest[r_idx + 1:].strip()
# key and value
else:
key = rest[:l_idx].strip()
rest = rest[l_idx + 1:].strip()
r_idx = rest.find(r_char)
if r_idx < 0:
if l_char == "(":
raise ValueError("invalid key/value string, missing right parethesis.")
else:
val = rest
rest = ""
else:
val = rest[:r_idx].strip()
rest = rest[r_idx + 1:].strip()
if extra_delimiter is not None:
if key.startswith(extra_delimiter):
key = key[1:].strip()
elif delimiter_required:
raise ValueError("invalid key/value string, missing delimiter.")
delimiter_required = True
# key exist
if len(key) > 0:
if keep_original_key is True:
lookup_key = key
else:
val = cls._parse_value("key/value", {"type": "str"}, key, val, user_ns)
lookup_key = key.lower().replace("-", "").replace("_", "")
matched_kv[lookup_key] = val
# no key but value exist
elif len(val) > 0:
raise ValueError("invalid key/value string, missing key.")
# no key, no value in parenthesis mode
elif l_char == "(":
raise ValueError("invalid key/value string, missing key.")
return matched_kv