parrot/utils.py
2023-04-10 04:20:05 +02:00

95 lines
2.2 KiB
Python

from typing import Generic, TypeVar
class UnwrapException(Exception):
def __init__(self, *args: object) -> None:
super().__init__(*args)
T = TypeVar("T")
E = TypeVar("E")
class Result(Generic[T, E]):
def __init__(self) -> None:
super().__init__()
def ok(self) -> bool:
raise NotImplementedError()
def value(self) -> T:
raise NotImplementedError()
def error(self) -> E:
raise NotImplementedError()
class Ok(Result[T, E]):
def __init__(self, value: T) -> None:
super().__init__()
self.__value = value
def ok(self) -> bool:
return True
def value(self) -> T:
return self.__value
def error(self) -> E:
raise UnwrapException("cannot unwrap error of ok result")
class Err(Result[T, E]):
def __init__(self, error: E) -> None:
super().__init__()
self.__error = error
def ok(self) -> bool:
return False
def value(self) -> T:
raise UnwrapException("cannot unwrap value of error result")
def error(self) -> E:
return self.__error
def unescape_string(value: str) -> Result[str, str]:
result = ""
i = 0
while i < len(value):
if value[i] == "\\":
i += 1
if i >= len(value):
return Err("unescaped '\\'")
elif value[i] == "0":
result += "\0"
elif value[i] == "n":
result += "\n"
elif value[i] == "t":
result += "\t"
elif value[i] == "r":
result += "\r"
else:
result += value[i]
else:
result += value[i]
i += 1
return Ok(result)
def escape_string(value: str) -> str:
result = ""
for char in value:
if char == "\0":
result += "\\0"
elif char == "\n":
result += "\\n"
elif char == "\t":
result += "\\t"
elif char == "\r":
result += "\\r"
elif char == "\"":
result += "\\\""
elif char == "\'":
result += "\\'"
elif char == "\\":
result += "\\\\"
else:
result += char
return result