38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
import io
|
|
from typing import Iterator, Self, Type
|
|
|
|
import pydantic
|
|
|
|
|
|
class _Account(pydantic.BaseModel):
|
|
name: str
|
|
login: str
|
|
password: str
|
|
|
|
@classmethod
|
|
def from_tuple(cls: Type[Self], tuple_: tuple[str, str, str]) -> Self:
|
|
return cls(name=tuple_[0], login=tuple_[1], password=tuple_[2])
|
|
|
|
def as_tuple(self: Self) -> tuple[str, str, str]:
|
|
return (self.name, self.login, self.password)
|
|
|
|
|
|
class _Accounts(pydantic.BaseModel):
|
|
accounts: list[_Account] = pydantic.Field(default_factory=list)
|
|
|
|
|
|
def _accounts_list_to_json(accounts: Iterator[tuple[str, str, str]]) -> str:
|
|
accounts = _Accounts(accounts=[_Account.from_tuple(i) for i in accounts])
|
|
return accounts.json(ensure_ascii=False)
|
|
|
|
|
|
def json_to_accounts(json_: str) -> list[tuple[str, str, str]]:
|
|
accounts = _Accounts.parse_raw(json_)
|
|
return [i.as_tuple() for i in accounts.accounts]
|
|
|
|
|
|
def accounts_to_json(accounts: Iterator[tuple[str, str, str]]) -> io.StringIO:
|
|
file = io.StringIO(_accounts_list_to_json(accounts))
|
|
file.name = "passwords.json"
|
|
return file
|