diff --git a/README b/README deleted file mode 100644 index bf355a1..0000000 --- a/README +++ /dev/null @@ -1,4 +0,0 @@ -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 new file mode 100644 index 0000000..d6f31c0 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +## 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 9b22875..fb52964 100644 --- a/dub.json +++ b/dub.json @@ -1,9 +1,9 @@ { "name": "initial", - "description": "INI parser", + "description": "INI parsing library for the D programming language", - "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 1843cec..7f4a585 100644 --- a/initial.d +++ b/initial.d @@ -3,29 +3,27 @@ * * 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. */ /++ @@ -217,9 +215,10 @@ 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. +/ @@ -235,10 +234,10 @@ struct INISection + with a message containing location information. +/ T - keyAs(T)(string k, T defaultValue) + keyAs(T)(string k, string defaultValue = null) { try - return k in keys ? keys[k].to!T() : defaultValue; + return key(k, defaultValue).to!T(); catch (ConvException) throw new INITypeException( format!"unable to convert [%s].%s to %s"(name, k, T.stringof));