diff --git a/README b/README new file mode 100644 index 0000000..bf355a1 --- /dev/null +++ b/README @@ -0,0 +1,4 @@ +This is initial, an INI parsing library for the D programming language. + +Reference documentation can be found in the source code as Ddoc comments. +A quick start guide can be found at . diff --git a/README.md b/README.md deleted file mode 100644 index d6f31c0..0000000 --- a/README.md +++ /dev/null @@ -1,76 +0,0 @@ -## initial - INI parser for the D programming language - -My attempt at making a sane and high-quality INI parsing library for D. - -```ini -[section] -key = value -``` - -The contents of an INI file is stored in an `INIUnit` structure. This -contains an associative array of `INISection`s that you can read or set -yourself. - -initial also provides serialisation facilities that can turn `INIUnit`s -and `INISection`s back into an INI document. Handy for if your program -has some sort of GUI configuration interface or if you're passing around -INI through a network connection. - -## Demo - -```d -INIUnit ini; - -/* write INI data to an INIUnit */ -ini["section"]["key"] = "value"; -ini["section"]["num"] = "4.8"; - -/* read INI data */ -readINI(ini, ` - [section] - num = 5.3 -`); - -assert(ini["section"]["key"] == "value"); -assert(ini["section"]["num"] == "5.3"); - -/* read INI from file */ -readINIFile(ini, "config.ini"); - -/* write INI to file */ -import std.file : write; -write("config.ini", ini.serialise()); -``` - -## Usage - -Copy initial.d to somewhere in your import path, then compile it alongside -your program and link it in. Or you can do it all at once by using -i. - - dmd program.d initial.d - dmd -i program.d - -Documentation can be found by reading the documentation comments in the code. - -## Progress - -### Finished - -- Keys -- Sections -- Default section -- Comments - -### Unimplemented - -- Key referencing - -Currently initial.d does all I need it to, and I consider it complete. -However if you have any questions, feel free to send an email to [my -public inbox][1] or directly to my address (jeremy@baxters.nz). Patches -are also welcome which you can generate with `git format-patch` and attach -to an email or just copy into the body of an email ([`git send-email`][2] -can do this automatically). - -[1]: https://lists.sr.ht/~jeremy/public-inbox -[2]: https://git-send-email.io diff --git a/dub.json b/dub.json index fb52964..9b22875 100644 --- a/dub.json +++ b/dub.json @@ -1,9 +1,9 @@ { "name": "initial", - "description": "INI parsing library for the D programming language", + "description": "INI parser", - "authors": ["Jeremy Baxter"], - "copyright": "Copyright © 2024, Jeremy Baxter", + "authors": ["Jeremy Baxter "], + "copyright": "Copyright © 2024 Jeremy Baxter", "license": "BSL-1.0", "targetType": "library", diff --git a/initial.d b/initial.d index 7f4a585..1843cec 100644 --- a/initial.d +++ b/initial.d @@ -3,27 +3,29 @@ * * Boost Software License - Version 1.0 - August 17th, 2003 * - * Permission is hereby granted, free of charge, to any person or organization - * obtaining a copy of the software and accompanying documentation covered by - * this license (the "Software") to use, reproduce, display, distribute, - * execute, and transmit the Software, and to prepare derivative works of the - * Software, and to permit third-parties to whom the Software is furnished to - * do so, all subject to the following: + * Permission is hereby granted, free of charge, to any person or + * organization obtaining a copy of the software and accompanying + * documentation covered by this license (the "Software") to use, + * reproduce, display, distribute, execute, and transmit the Software, + * and to prepare derivative works of the Software, and to permit + * third-parties to whom the Software is furnished to do so, all + * subject to the following: * - * The copyright notices in the Software and this entire statement, including - * the above license grant, this restriction and the following disclaimer, - * must be included in all copies of the Software, in whole or in part, and - * all derivative works of the Software, unless such copies or derivative - * works are solely in the form of machine-executable object code generated by - * a source language processor. + * The copyright notices in the Software and this entire statement, + * including the above license grant, this restriction and the following + * disclaimer, must be included in all copies of the Software, in whole or + * in part, and all derivative works of the Software, unless such copies or + * derivative works are solely in the form of machine-executable object + * code generated by a source language processor. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND + * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE + * DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, + * WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ /++ @@ -215,10 +217,9 @@ struct INISection this(string name) nothrow { this.name = name; - keys = new string[string]; } - /+ + /++ + Returns the value of `k` in this section or + `defaultValue` if the key is not present. +/ @@ -234,10 +235,10 @@ struct INISection + with a message containing location information. +/ T - keyAs(T)(string k, string defaultValue = null) + keyAs(T)(string k, T defaultValue) { try - return key(k, defaultValue).to!T(); + return k in keys ? keys[k].to!T() : defaultValue; catch (ConvException) throw new INITypeException( format!"unable to convert [%s].%s to %s"(name, k, T.stringof));