Compare commits

..

10 commits

Author SHA1 Message Date
db7be633a2 add minimal readme 2025-04-30 21:35:02 +12:00
daef20ac59 .build.yml: drop 2025-04-30 20:25:01 +12:00
a3d17fdc6c fix error with LDC 1.30.0: cannot create a string[string] with new 2024-08-08 17:53:01 +12:00
f115e01586 wrap lines 2024-08-08 17:52:20 +12:00
c728f0f0e6 README.md: add build status 2024-08-08 17:47:55 +12:00
0b0a306736 .build.yml: init 2024-08-08 17:44:35 +12:00
c00e0fa7e6 avoid converting objects twice
If I have an object of type T and want to set it as the default
value for a call to .keyAs(), I have to convert it to a string first.
This string would then get converted again in case the key doesn't exist
in the section.
2024-06-18 17:42:36 +12:00
baafe10b17 fix doc comment 2024-06-18 17:42:26 +12:00
fb85533933 update dub.json 2024-06-05 12:39:51 +12:00
dcdbbff878 add copying notice 2024-06-05 12:33:14 +12:00
4 changed files with 31 additions and 102 deletions

4
README Normal file
View file

@ -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 <https://reformers.dev/initial>.

View file

@ -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

View file

@ -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 <jeremy@baxters.nz>"],
"copyright": "Copyright © 2024 Jeremy Baxter",
"license": "BSL-1.0",
"targetType": "library",

View file

@ -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));