diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..400e7c1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Используйте IntelliSense, чтобы узнать о возможных атрибутах. + // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов. + // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "code-d", + "request": "launch", + "dubBuild": true, + "name": "Build & Debug DUB project", + "cwd": "${command:dubWorkingDirectory}", + "program": "bin/${command:dubTarget}" + } + ] +} \ No newline at end of file diff --git a/snapd.json b/snapd.json index 1dc307f..d8b0536 100644 --- a/snapd.json +++ b/snapd.json @@ -1,4 +1,5 @@ { - "git": "/var/lib/snapd", - "project": "/" + "git": "/var/lib/snapd", + "project": "/", + "email": "user@site.domain" } diff --git a/source/app.d b/source/app.d index b452dbf..3ac5b7a 100644 --- a/source/app.d +++ b/source/app.d @@ -2,7 +2,9 @@ import snapd; import commandr; import std.file; -import core.stdc.stdlib : EXIT_SUCCESS; +import std.stdio : writeln; + +import core.stdc.stdlib : EXIT_SUCCESS, EXIT_FAILURE; private string programName = "snapd"; @@ -18,10 +20,16 @@ int main(string[] args) ) .parse(args); - string configFile = "snapd.json"; - configFile = argumets.option("config", configFile); + string configFile = argumets.option("config", "snapd.json"); - auto sc = new SnapdConfig(configFile); + SnapdConfig config; + + try { + config = new SnapdConfig(configFile); + } catch (SnapdConfigException e) { + e.print(); + return EXIT_FAILURE; + } return EXIT_SUCCESS; } diff --git a/source/snapd/config.d b/source/snapd/config.d deleted file mode 100644 index d093331..0000000 --- a/source/snapd/config.d +++ /dev/null @@ -1,20 +0,0 @@ -module snapd.config; - -import std.json; -import std.file; -import std.stdio : writeln; - -class SnapdConfig { - private string _git; - private string _project; - - this(string configFile) { - string jsonText = readText(configFile); - - auto jsonData = parseJSON(jsonText); - if ("gits" !in jsonData) - writeln("Ключ отсутствует"); - writeln(jsonData["git"].str); - writeln(jsonData["project"].str); - } -} diff --git a/source/snapd/config/config.d b/source/snapd/config/config.d new file mode 100644 index 0000000..5822758 --- /dev/null +++ b/source/snapd/config/config.d @@ -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; } +} diff --git a/source/snapd/config/exception.d b/source/snapd/config/exception.d new file mode 100644 index 0000000..1abc0e5 --- /dev/null +++ b/source/snapd/config/exception.d @@ -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); + } +} diff --git a/source/snapd/config/package.d b/source/snapd/config/package.d new file mode 100644 index 0000000..5dd2aed --- /dev/null +++ b/source/snapd/config/package.d @@ -0,0 +1,4 @@ +module snapd.config; + +public import snapd.config.exception; +public import snapd.config.config; diff --git a/source/snapd/version_.d b/source/snapd/version_.d index e09faec..98d0114 100644 --- a/source/snapd/version_.d +++ b/source/snapd/version_.d @@ -1,3 +1,3 @@ module snapd.version_; -enum snapdVersion = "0.0.1"; +enum snapdVersion = "0.0.2";