Доработан модуль конфигурации, включающий исключения при возникновении ошибок

This commit is contained in:
Alexander Zhirov 2025-05-23 20:47:53 +03:00
parent 309a47ea3a
commit f1d1bce20b
Signed by: alexander
GPG key ID: C8D8BE544A27C511
3 changed files with 111 additions and 0 deletions

View file

@ -0,0 +1,93 @@
module snapd.config.config;
import std.json;
import std.file;
import std.path;
import std.regex;
import std.string;
import snapd.config.exception;
class SnapdConfig {
private string _git;
private string _project;
private string _email;
private bool isValidEmail(string email) {
auto emailPattern = ctRegex!r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
return !matchFirst(email, emailPattern).empty;
}
this(string configFile) {
string jsonText;
JSONValue jsonData;
try {
jsonText = readText(configFile);
jsonData = parseJSON(jsonText);
} catch (Exception e) {
throw new SnapdConfigException(
"An error occurred while reading the configuration file:\n\t"
~ e.msg
);
}
if ("git" !in jsonData)
throw new SnapdConfigException(
"The configuration file is missing the \"git\" parameter"
);
_git = jsonData["git"].str;
if (!_git.length)
throw new SnapdConfigException(
"The \"git\" parameter must contain the path to the directory"
);
if (!_git.isAbsolute)
throw new SnapdConfigException(
"The \"git\" parameter must be an absolute path to the directory:\n\t"
~ _git
);
if ("project" !in jsonData)
throw new SnapdConfigException(
"The configuration file is missing the \"project\" parameter"
);
_project = jsonData["project"].str;
if (!_project.length)
throw new SnapdConfigException(
"The \"project\" parameter must contain the path to the directory"
);
if (!_project.isAbsolute)
throw new SnapdConfigException(
"The \"project\" parameter must be an absolute path to the directory:\n\t"
~ _project
);
if ("email" !in jsonData)
throw new SnapdConfigException(
"The configuration file is missing the \"email\" parameter"
);
_email = jsonData["email"].str;
if (!_email.length)
throw new SnapdConfigException(
"The \"email\" parameter must contain an email address"
);
if (!isValidEmail(_email))
throw new SnapdConfigException(
"Invalid email address provided in the \"email\" parameter:\n\t"
~ _email
);
}
@property string git() const { return _git; }
@property string project() const { return _project; }
@property string email() const { return _email; }
}

View file

@ -0,0 +1,14 @@
module snapd.config.exception;
import std.exception;
import std.stdio : writeln;
class SnapdConfigException : Exception {
this(string msg, string file = __FILE__, size_t line = __LINE__) {
super(msg, file, line);
}
void print() {
writeln(msg);
}
}

View file

@ -0,0 +1,4 @@
module snapd.config;
public import snapd.config.exception;
public import snapd.config.config;