Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a toml esq configuration reader and writer #620

Merged
merged 48 commits into from
Mar 13, 2025
Merged
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
0aee480
First pass at a toml parser
GregHib Mar 6, 2025
67d552d
Add full support and comparisons to tests
GregHib Mar 6, 2025
a4660ff
More fixes and test
GregHib Mar 6, 2025
a438b7e
Add full example, fix timestamps
GregHib Mar 6, 2025
0974655
Rename to strict-toml
GregHib Mar 6, 2025
c68e229
Remove dates and scientific notation
GregHib Mar 6, 2025
b253907
Remove immutable structures
GregHib Mar 6, 2025
6c5c55d
Tweak
GregHib Mar 7, 2025
e679cef
Add support for table inheritance
GregHib Mar 7, 2025
8e5a5c0
Tidy
GregHib Mar 7, 2025
dd24169
Tidy
GregHib Mar 7, 2025
e253e23
Performance improvements
GregHib Mar 7, 2025
1df61f8
Performance improvements, remove support for special floats
GregHib Mar 7, 2025
980a7cc
Remove manual line counting
GregHib Mar 7, 2025
85dbb93
More optimising
GregHib Mar 7, 2025
e2389d7
Optimising numbers
GregHib Mar 7, 2025
e1b0281
Convert to singleton
GregHib Mar 7, 2025
58b2a19
Basic benchmarks
GregHib Mar 7, 2025
6f4ecbb
Add a crazy streaming parser
GregHib Mar 8, 2025
02ceb10
Refactor
GregHib Mar 10, 2025
e97ed5f
Add previous table alias/referencing
GregHib Mar 10, 2025
b261dfe
Add map api impl and tidy up Toml
GregHib Mar 10, 2025
44049d3
Add toml writer
GregHib Mar 10, 2025
bd965cf
Change address buffer use to Any type
GregHib Mar 10, 2025
63873c2
Add support for array of tables
GregHib Mar 11, 2025
93a7cd1
Add support for scientific notation
GregHib Mar 11, 2025
fbb7422
Update tests
GregHib Mar 11, 2025
c3747b2
Add ini file reader
GregHib Mar 12, 2025
427e47a
Refactor
GregHib Mar 12, 2025
c54e7f7
Add basic encoder
GregHib Mar 12, 2025
c19870f
Tidy up config classes
GregHib Mar 12, 2025
8b50852
Fix mistake
GregHib Mar 12, 2025
b874ad7
Rename module to config
GregHib Mar 12, 2025
28d0800
Update tests
GregHib Mar 12, 2025
8a32fed
Update tests
GregHib Mar 12, 2025
38f01ee
Update tests
GregHib Mar 12, 2025
d377708
Start adding writer tests
GregHib Mar 13, 2025
36b507e
Add basic writer type tests
GregHib Mar 13, 2025
5130685
Remove Toml parser
GregHib Mar 13, 2025
ed56dbe
Improvements and tests
GregHib Mar 13, 2025
a43f536
Change how writer works
GregHib Mar 13, 2025
4916b86
Tidy up errors
GregHib Mar 13, 2025
b4e4930
Update readme
GregHib Mar 13, 2025
03ca46c
Rename to Config
GregHib Mar 13, 2025
1e857cc
Fix tests
GregHib Mar 13, 2025
c026b2e
Little tidy
GregHib Mar 13, 2025
44ff14a
Remove comment
GregHib Mar 13, 2025
fbc18b7
Update readme
GregHib Mar 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add previous table alias/referencing
  • Loading branch information
GregHib committed Mar 10, 2025
commit e97ed5f348ccd21fd2ce35a28db34544b24abdac
58 changes: 34 additions & 24 deletions strict-toml/src/main/kotlin/world/gregs/toml/read/TomlStream.kt
Original file line number Diff line number Diff line change
@@ -5,37 +5,39 @@ import java.io.BufferedInputStream
class TomlStream {

interface API {
fun table(address: Array<String>, addressSize: Int)
fun inlineTable(address: Array<String>, addressSize: Int)
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Double)
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Long)
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: String)
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Boolean)
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: List<Any>)
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Map<String, Any>)
fun mapEnd(address: Array<String>, addressSize: Int)

fun list(address: Array<String>, addressSize: Int)
fun appendList(address: Array<String>, addressSize: Int, value: Double)
fun appendList(address: Array<String>, addressSize: Int, value: Long)
fun appendList(address: Array<String>, addressSize: Int, value: String)
fun appendList(address: Array<String>, addressSize: Int, value: Boolean)
fun appendList(address: Array<String>, addressSize: Int, value: List<Any>)
fun appendList(address: Array<String>, addressSize: Int, value: Map<String, Any>)
fun listEnd(address: Array<String>, addressSize: Int)
fun table(address: Array<String>, addressSize: Int) {}
fun inlineTable(address: Array<String>, addressSize: Int) {}
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Double) {}
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Long) {}
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: String) {}
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Boolean) {}
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: List<Any>) {}
fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Map<String, Any>) {}
fun mapEnd(address: Array<String>, addressSize: Int) {}

fun list(address: Array<String>, addressSize: Int) {}
fun appendList(address: Array<String>, addressSize: Int, value: Double) {}
fun appendList(address: Array<String>, addressSize: Int, value: Long) {}
fun appendList(address: Array<String>, addressSize: Int, value: String) {}
fun appendList(address: Array<String>, addressSize: Int, value: Boolean) {}
fun appendList(address: Array<String>, addressSize: Int, value: List<Any>) {}
fun appendList(address: Array<String>, addressSize: Int, value: Map<String, Any>) {}
fun listEnd(address: Array<String>, addressSize: Int) {}
}

/**
* TODO
* fix empty address for nested inline tables
* remove address.copying(), replace with addressIndex-- once out of a scope
* [x] fix empty address for nested inline tables
* [x] remove address.copying(), replace with addressIndex-- once out of a scope
* remove keyName checks with an array and table version of each method?
* [x] support custom alias syntax
*/
fun read(input: BufferedInputStream, api: API) {
val buffer = ByteArray(1024)
var bufferIndex = 0
val address = Array(10) { "" }
var addressIndex = 0
var previousIndex = 0
var byte = input.read()

while (byte != EOF) {
@@ -65,11 +67,15 @@ class TomlStream {
byte = input.read()
}

// Reset address index for new table context
for (i in 0 until addressIndex) {
address[i] = ""
val absoluteAddress = byte != DOT
if (absoluteAddress) {
// Reset address index for new table context
addressIndex = 0
} else {
addressIndex = previousIndex
byte = input.read() // Skip dot
}
addressIndex = 0


// Read table name
while (byte != CLOSE_BRACKET && byte != EOF) {
@@ -89,6 +95,10 @@ class TomlStream {
bufferIndex = 0
}

if (absoluteAddress) {
previousIndex = addressIndex
}

// Handle array of tables close bracket
if (isArrayOfTables) {
byte = input.read()
Original file line number Diff line number Diff line change
@@ -88,57 +88,6 @@ class TomlStreamTest {
val file = File("C:\\Users\\Greg\\AppData\\Roaming\\JetBrains\\IntelliJIdea2024.3\\scratches\\scratch.toml")
val streaming = TomlStream()
val api = object : TomlStream.API {
override fun table(address: Array<String>, addressSize: Int) {
}

override fun inlineTable(address: Array<String>, addressSize: Int) {
}

override fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Double) {
}

override fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Long) {
}

override fun appendMap(address: Array<String>, addressSize: Int, key: String, value: String) {
}

override fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Boolean) {
}

override fun appendMap(address: Array<String>, addressSize: Int, key: String, value: List<Any>) {
}

override fun appendMap(address: Array<String>, addressSize: Int, key: String, value: Map<String, Any>) {
}

override fun mapEnd(address: Array<String>, addressSize: Int) {
}

override fun list(address: Array<String>, addressSize: Int) {
}

override fun appendList(address: Array<String>, addressSize: Int, value: Double) {
}

override fun appendList(address: Array<String>, addressSize: Int, value: Long) {
}

override fun appendList(address: Array<String>, addressSize: Int, value: String) {
}

override fun appendList(address: Array<String>, addressSize: Int, value: Boolean) {
}

override fun appendList(address: Array<String>, addressSize: Int, value: List<Any>) {
}

override fun appendList(address: Array<String>, addressSize: Int, value: Map<String, Any>) {
}

override fun listEnd(address: Array<String>, addressSize: Int) {
}

}
var count = 10
var start = System.nanoTime()