Add config_auditor module files: cli, discovery, parsers
This commit is contained in:
74
config_auditor/parsers.py
Normal file
74
config_auditor/parsers.py
Normal file
@@ -0,0 +1,74 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Any, Dict, Optional
|
||||
import json
|
||||
import toml
|
||||
import yaml
|
||||
|
||||
|
||||
class Parser(ABC):
|
||||
@abstractmethod
|
||||
def parse(self, content: str) -> Optional[Dict[str, Any]]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def dump(self, data: Dict[str, Any]) -> str:
|
||||
pass
|
||||
|
||||
|
||||
class JsonParser(Parser):
|
||||
def parse(self, content: str) -> Optional[Dict[str, Any]]:
|
||||
try:
|
||||
return json.loads(content)
|
||||
except json.JSONDecodeError:
|
||||
return None
|
||||
|
||||
def dump(self, data: Dict[str, Any]) -> str:
|
||||
return json.dumps(data, indent=2)
|
||||
|
||||
|
||||
class YamlParser(Parser):
|
||||
def parse(self, content: str) -> Optional[Dict[str, Any]]:
|
||||
try:
|
||||
return yaml.safe_load(content)
|
||||
except yaml.YAMLError:
|
||||
return None
|
||||
|
||||
def dump(self, data: Dict[str, Any]) -> str:
|
||||
return yaml.dump(data, default_flow_style=False)
|
||||
|
||||
|
||||
class TomlParser(Parser):
|
||||
def parse(self, content: str) -> Optional[Dict[str, Any]]:
|
||||
try:
|
||||
return toml.loads(content)
|
||||
except toml.TomlDecodeError:
|
||||
return None
|
||||
|
||||
def dump(self, data: Dict[str, Any]) -> str:
|
||||
return toml.dumps(data)
|
||||
|
||||
|
||||
class ParserFactory:
|
||||
PARSERS = {
|
||||
"json": JsonParser,
|
||||
"yaml": YamlParser,
|
||||
"toml": TomlParser,
|
||||
}
|
||||
|
||||
def get_parser(self, format_type: str) -> Optional[Parser]:
|
||||
parser_class = self.PARSERS.get(format_type.lower())
|
||||
if parser_class:
|
||||
return parser_class()
|
||||
return None
|
||||
|
||||
def parse(self, format_type: str, content: str) -> Optional[Dict[str, Any]]:
|
||||
parser = self.get_parser(format_type)
|
||||
if parser:
|
||||
return parser.parse(content)
|
||||
return None
|
||||
|
||||
def dump(self, format_type: str, data: Dict[str, Any]) -> Optional[str]:
|
||||
parser = self.get_parser(format_type)
|
||||
if parser:
|
||||
return parser.dump(data)
|
||||
return None
|
||||
Reference in New Issue
Block a user