This commit is contained in:
		
							
								
								
									
										23
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					name: test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - master
 | 
				
			||||||
 | 
					      - main
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  test:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: actions/checkout@v4
 | 
				
			||||||
 | 
					      - uses: erlef/setup-beam@v1
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          otp-version: "27.1.2"
 | 
				
			||||||
 | 
					          gleam-version: "1.12.0"
 | 
				
			||||||
 | 
					          rebar3-version: "3"
 | 
				
			||||||
 | 
					          # elixir-version: "1"
 | 
				
			||||||
 | 
					      - run: gleam deps download
 | 
				
			||||||
 | 
					      - run: gleam test
 | 
				
			||||||
 | 
					      - run: gleam format --check src test
 | 
				
			||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					*.beam
 | 
				
			||||||
 | 
					*.ez
 | 
				
			||||||
 | 
					/build
 | 
				
			||||||
 | 
					erl_crash.dump
 | 
				
			||||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					[submodule "toml-test"]
 | 
				
			||||||
 | 
						path = toml-test
 | 
				
			||||||
 | 
						url = https://github.com/toml-lang/toml-test.git
 | 
				
			||||||
							
								
								
									
										24
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					# gltoml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[](https://hex.pm/packages/gltoml)
 | 
				
			||||||
 | 
					[](https://hexdocs.pm/gltoml/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					gleam add gltoml@1
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					```gleam
 | 
				
			||||||
 | 
					import gltoml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn main() -> Nil {
 | 
				
			||||||
 | 
					  // TODO: An example of the project in use
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Further documentation can be found at <https://hexdocs.pm/gltoml>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Development
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					gleam run   # Run the project
 | 
				
			||||||
 | 
					gleam test  # Run the tests
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										23
									
								
								gleam.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								gleam.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					name = "gltoml"
 | 
				
			||||||
 | 
					version = "1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Fill out these fields if you intend to generate HTML documentation or publish
 | 
				
			||||||
 | 
					# your project to the Hex package manager.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# description = ""
 | 
				
			||||||
 | 
					# licences = ["Apache-2.0"]
 | 
				
			||||||
 | 
					# repository = { type = "github", user = "", repo = "" }
 | 
				
			||||||
 | 
					# links = [{ title = "Website", href = "" }]
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# For a full reference of all the available options, you can have a look at
 | 
				
			||||||
 | 
					# https://gleam.run/writing-gleam/gleam-toml/.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dependencies]
 | 
				
			||||||
 | 
					gleam_stdlib = ">= 0.44.0 and < 2.0.0"
 | 
				
			||||||
 | 
					tom = ">= 2.0.0 and < 3.0.0"
 | 
				
			||||||
 | 
					gleam_time = ">= 1.4.0 and < 2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[dev-dependencies]
 | 
				
			||||||
 | 
					gleeunit = ">= 1.0.0 and < 2.0.0"
 | 
				
			||||||
 | 
					startest = ">= 0.7.0 and < 1.0.0"
 | 
				
			||||||
 | 
					simplifile = ">= 2.3.0 and < 3.0.0"
 | 
				
			||||||
							
								
								
									
										35
									
								
								manifest.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								manifest.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					# This file was generated by Gleam
 | 
				
			||||||
 | 
					# You typically do not need to edit this file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					packages = [
 | 
				
			||||||
 | 
					  { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" },
 | 
				
			||||||
 | 
					  { name = "bigben", version = "1.0.1", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "bigben", source = "hex", outer_checksum = "190E489610A80D76C48BACC75EB8314BD184FF0220AB0F251ABE760B993B91BB" },
 | 
				
			||||||
 | 
					  { name = "birl", version = "1.8.0", build_tools = ["gleam"], requirements = ["gleam_regexp", "gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "2AC7BA26F998E3DFADDB657148BD5DDFE966958AD4D6D6957DD0D22E5B56C400" },
 | 
				
			||||||
 | 
					  { name = "exception", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "329D269D5C2A314F7364BD2711372B6F2C58FA6F39981572E5CA68624D291F8C" },
 | 
				
			||||||
 | 
					  { name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "B06A9AF0BF10E51401D64B98E4B627F1D2E48C154967DA7AF4D0914780A6D40A" },
 | 
				
			||||||
 | 
					  { name = "gleam_community_ansi", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "8A62AE9CC6EA65BEA630D95016D6C07E4F9973565FA3D0DE68DC4200D8E0DD27" },
 | 
				
			||||||
 | 
					  { name = "gleam_community_colour", version = "2.0.2", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "E34DD2C896AC3792151EDA939DA435FF3B69922F33415ED3C4406C932FBE9634" },
 | 
				
			||||||
 | 
					  { name = "gleam_erlang", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "1124AD3AA21143E5AF0FC5CF3D9529F6DB8CA03E43A55711B60B6B7B3874375C" },
 | 
				
			||||||
 | 
					  { name = "gleam_javascript", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "EF6C77A506F026C6FB37941889477CD5E4234FCD4337FF0E9384E297CB8F97EB" },
 | 
				
			||||||
 | 
					  { name = "gleam_json", version = "3.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "874FA3C3BB6E22DD2BB111966BD40B3759E9094E05257899A7C08F5DE77EC049" },
 | 
				
			||||||
 | 
					  { name = "gleam_otp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "7987CBEBC8060B88F14575DEF546253F3116EBE2A5DA6FD82F38243FCE97C54B" },
 | 
				
			||||||
 | 
					  { name = "gleam_regexp", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "9C215C6CA84A5B35BB934A9B61A9A306EC743153BE2B0425A0D032E477B062A9" },
 | 
				
			||||||
 | 
					  { name = "gleam_stdlib", version = "0.63.2", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "962B25C667DA07F4CAB32001F44D3C41C1A89E58E3BBA54F183B482CF6122150" },
 | 
				
			||||||
 | 
					  { name = "gleam_time", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_time", source = "hex", outer_checksum = "DCDDC040CE97DA3D2A925CDBBA08D8A78681139745754A83998641C8A3F6587E" },
 | 
				
			||||||
 | 
					  { name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" },
 | 
				
			||||||
 | 
					  { name = "gleeunit", version = "1.6.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "FDC68A8C492B1E9B429249062CD9BAC9B5538C6FBF584817205D0998C42E1DAC" },
 | 
				
			||||||
 | 
					  { name = "glint", version = "1.2.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "2214C7CEFDE457CEE62140C3D4899B964E05236DA74E4243DFADF4AF29C382BB" },
 | 
				
			||||||
 | 
					  { name = "ranger", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_yielder"], otp_app = "ranger", source = "hex", outer_checksum = "C8988E8F8CDBD3E7F4D8F2E663EF76490390899C2B2885A6432E942495B3E854" },
 | 
				
			||||||
 | 
					  { name = "simplifile", version = "2.3.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0A868DAC6063D9E983477981839810DC2E553285AB4588B87E3E9C96A7FB4CB4" },
 | 
				
			||||||
 | 
					  { name = "snag", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "7E9F06390040EB5FAB392CE642771484136F2EC103A92AE11BA898C8167E6E17" },
 | 
				
			||||||
 | 
					  { name = "startest", version = "0.7.0", build_tools = ["gleam"], requirements = ["argv", "bigben", "birl", "exception", "gleam_community_ansi", "gleam_erlang", "gleam_javascript", "gleam_regexp", "gleam_stdlib", "glint", "simplifile", "tom"], otp_app = "startest", source = "hex", outer_checksum = "71B9CB82C4B8779A4BD54C7151DF7D0B0F778D0DDE805B782B44EFA7BA8F50DA" },
 | 
				
			||||||
 | 
					  { name = "tom", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_time"], otp_app = "tom", source = "hex", outer_checksum = "74D0C5A3761F7A7D06994755D4D5AD854122EF8E9F9F76A3E7547606D8C77091" },
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[requirements]
 | 
				
			||||||
 | 
					gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" }
 | 
				
			||||||
 | 
					gleam_time = { version = ">= 1.4.0 and < 2.0.0" }
 | 
				
			||||||
 | 
					gleeunit = { version = ">= 1.0.0 and < 2.0.0" }
 | 
				
			||||||
 | 
					simplifile = { version = ">= 2.3.0 and < 3.0.0" }
 | 
				
			||||||
 | 
					startest = { version = ">= 0.7.0 and < 1.0.0" }
 | 
				
			||||||
 | 
					tom = { version = ">= 2.0.0 and < 3.0.0" }
 | 
				
			||||||
							
								
								
									
										247
									
								
								src/TOML.abnf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								src/TOML.abnf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,247 @@
 | 
				
			|||||||
 | 
					;; This document describes TOML's syntax, using the ABNF format (defined in
 | 
				
			||||||
 | 
					;; RFC 5234 -- https://www.ietf.org/rfc/rfc5234.txt).
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; Although a TOML document must be valid UTF-8, this grammar refers to the
 | 
				
			||||||
 | 
					;; Unicode Code Points you get after you decode the UTF-8 input.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; All valid TOML documents will match this description, however certain
 | 
				
			||||||
 | 
					;; invalid documents would need to be rejected as per the semantics described
 | 
				
			||||||
 | 
					;; in the supporting text description.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; It is possible to try this grammar interactively, using instaparse.
 | 
				
			||||||
 | 
					;;     http://instaparse.mojombo.com/
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; To do so, in the lower right, click on Options and change `:input-format` to
 | 
				
			||||||
 | 
					;; ':abnf'. Then paste this entire ABNF document into the grammar entry box
 | 
				
			||||||
 | 
					;; (above the options). Then you can type or paste a sample TOML document into
 | 
				
			||||||
 | 
					;; the beige box on the left. Tada!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Overall Structure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					toml = expression *( newline expression )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					expression =  ws [ comment ]
 | 
				
			||||||
 | 
					expression =/ ws keyval ws [ comment ]
 | 
				
			||||||
 | 
					expression =/ ws table ws [ comment ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Whitespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ws = *wschar
 | 
				
			||||||
 | 
					wschar =  %x20  ; Space
 | 
				
			||||||
 | 
					wschar =/ %x09  ; Horizontal tab
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Newline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					newline =  %x0A     ; LF
 | 
				
			||||||
 | 
					newline =/ %x0D.0A  ; CRLF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Comment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					comment-start-symbol = %x23 ; #
 | 
				
			||||||
 | 
					non-ascii = %x80-D7FF / %xE000-10FFFF
 | 
				
			||||||
 | 
					non-eol = %x09 / %x20-7E / non-ascii
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					comment = comment-start-symbol *non-eol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Key-Value pairs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					keyval = key keyval-sep val
 | 
				
			||||||
 | 
					key = simple-key / dotted-key
 | 
				
			||||||
 | 
					val = string / boolean / array / inline-table / date-time / float / integer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					simple-key = quoted-key / unquoted-key
 | 
				
			||||||
 | 
					unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Quoted and dotted key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					quoted-key = basic-string / literal-string
 | 
				
			||||||
 | 
					dotted-key = simple-key 1*( dot-sep simple-key )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dot-sep   = ws %x2E ws  ; . Period
 | 
				
			||||||
 | 
					keyval-sep = ws %x3D ws ; =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					string = ml-basic-string / basic-string / ml-literal-string / literal-string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Basic String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basic-string = quotation-mark *basic-char quotation-mark
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					quotation-mark = %x22            ; "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basic-char = basic-unescaped / escaped
 | 
				
			||||||
 | 
					basic-unescaped = wschar / %x21 / %x23-5B / %x5D-7E / non-ascii
 | 
				
			||||||
 | 
					escaped = escape escape-seq-char
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					escape = %x5C                   ; \
 | 
				
			||||||
 | 
					escape-seq-char =  %x22         ; "    quotation mark  U+0022
 | 
				
			||||||
 | 
					escape-seq-char =/ %x5C         ; \    reverse solidus U+005C
 | 
				
			||||||
 | 
					escape-seq-char =/ %x62         ; b    backspace       U+0008
 | 
				
			||||||
 | 
					escape-seq-char =/ %x65         ; e    escape          U+001B
 | 
				
			||||||
 | 
					escape-seq-char =/ %x66         ; f    form feed       U+000C
 | 
				
			||||||
 | 
					escape-seq-char =/ %x6E         ; n    line feed       U+000A
 | 
				
			||||||
 | 
					escape-seq-char =/ %x72         ; r    carriage return U+000D
 | 
				
			||||||
 | 
					escape-seq-char =/ %x74         ; t    tab             U+0009
 | 
				
			||||||
 | 
					escape-seq-char =/ %x78 2HEXDIG ; xHH                  U+00HH
 | 
				
			||||||
 | 
					escape-seq-char =/ %x75 4HEXDIG ; uHHHH                U+HHHH
 | 
				
			||||||
 | 
					escape-seq-char =/ %x55 8HEXDIG ; UHHHHHHHH            U+HHHHHHHH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Multiline Basic String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ml-basic-string = ml-basic-string-delim [ newline ] ml-basic-body
 | 
				
			||||||
 | 
					                  ml-basic-string-delim
 | 
				
			||||||
 | 
					ml-basic-string-delim = 3quotation-mark
 | 
				
			||||||
 | 
					ml-basic-body = *mlb-content *( mlb-quotes 1*mlb-content ) [ mlb-quotes ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mlb-content = basic-char / newline / mlb-escaped-nl
 | 
				
			||||||
 | 
					mlb-quotes = 1*2quotation-mark
 | 
				
			||||||
 | 
					mlb-escaped-nl = escape ws newline *( wschar / newline )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Literal String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					literal-string = apostrophe *literal-char apostrophe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					apostrophe = %x27 ; ' apostrophe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					literal-char = %x09 / %x20-26 / %x28-7E / non-ascii
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Multiline Literal String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ml-literal-string = ml-literal-string-delim [ newline ] ml-literal-body
 | 
				
			||||||
 | 
					                    ml-literal-string-delim
 | 
				
			||||||
 | 
					ml-literal-string-delim = 3apostrophe
 | 
				
			||||||
 | 
					ml-literal-body = *mll-content *( mll-quotes 1*mll-content ) [ mll-quotes ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mll-content = literal-char / newline
 | 
				
			||||||
 | 
					mll-quotes = 1*2apostrophe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Integer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					integer = dec-int / hex-int / oct-int / bin-int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					minus = %x2D                       ; -
 | 
				
			||||||
 | 
					plus = %x2B                        ; +
 | 
				
			||||||
 | 
					underscore = %x5F                  ; _
 | 
				
			||||||
 | 
					digit1-9 = %x31-39                 ; 1-9
 | 
				
			||||||
 | 
					digit0-7 = %x30-37                 ; 0-7
 | 
				
			||||||
 | 
					digit0-1 = %x30-31                 ; 0-1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hex-prefix = %x30.78               ; 0x
 | 
				
			||||||
 | 
					oct-prefix = %x30.6F               ; 0o
 | 
				
			||||||
 | 
					bin-prefix = %x30.62               ; 0b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dec-int = [ minus / plus ] unsigned-dec-int
 | 
				
			||||||
 | 
					unsigned-dec-int = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hex-int = hex-prefix HEXDIG *( HEXDIG / underscore HEXDIG )
 | 
				
			||||||
 | 
					oct-int = oct-prefix digit0-7 *( digit0-7 / underscore digit0-7 )
 | 
				
			||||||
 | 
					bin-int = bin-prefix digit0-1 *( digit0-1 / underscore digit0-1 )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Float
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float = float-int-part ( exp / frac [ exp ] )
 | 
				
			||||||
 | 
					float =/ special-float
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float-int-part = dec-int
 | 
				
			||||||
 | 
					frac = decimal-point zero-prefixable-int
 | 
				
			||||||
 | 
					decimal-point = %x2E               ; .
 | 
				
			||||||
 | 
					zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exp = "e" float-exp-part
 | 
				
			||||||
 | 
					float-exp-part = [ minus / plus ] zero-prefixable-int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					special-float = [ minus / plus ] ( inf / nan )
 | 
				
			||||||
 | 
					inf = %x69.6E.66  ; inf
 | 
				
			||||||
 | 
					nan = %x6E.61.6E  ; nan
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					boolean = true / false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true    = %x74.72.75.65     ; true
 | 
				
			||||||
 | 
					false   = %x66.61.6C.73.65  ; false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Date and Time (as defined in RFC 3339)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					date-time      = offset-date-time / local-date-time / local-date / local-time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					date-fullyear  = 4DIGIT
 | 
				
			||||||
 | 
					date-month     = 2DIGIT  ; 01-12
 | 
				
			||||||
 | 
					date-mday      = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on month/year
 | 
				
			||||||
 | 
					time-delim     = "T" / %x20 ; T, t, or space
 | 
				
			||||||
 | 
					time-hour      = 2DIGIT  ; 00-23
 | 
				
			||||||
 | 
					time-minute    = 2DIGIT  ; 00-59
 | 
				
			||||||
 | 
					time-second    = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap second rules
 | 
				
			||||||
 | 
					time-secfrac   = "." 1*DIGIT
 | 
				
			||||||
 | 
					time-numoffset = ( "+" / "-" ) time-hour ":" time-minute
 | 
				
			||||||
 | 
					time-offset    = "Z" / time-numoffset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					partial-time   = time-hour ":" time-minute [ ":" time-second [ time-secfrac ] ]
 | 
				
			||||||
 | 
					full-date      = date-fullyear "-" date-month "-" date-mday
 | 
				
			||||||
 | 
					full-time      = partial-time time-offset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Offset Date-Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					offset-date-time = full-date time-delim full-time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Local Date-Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local-date-time = full-date time-delim partial-time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Local Date
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local-date = full-date
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Local Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local-time = partial-time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Array
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					array = array-open [ array-values ] ws-comment-newline array-close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					array-open =  %x5B ; [
 | 
				
			||||||
 | 
					array-close = %x5D ; ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					array-values =  ws-comment-newline val ws-comment-newline array-sep array-values
 | 
				
			||||||
 | 
					array-values =/ ws-comment-newline val ws-comment-newline [ array-sep ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					array-sep = %x2C  ; , Comma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ws-comment-newline = *( wschar / [ comment ] newline )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table = std-table / array-table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Standard Table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std-table = std-table-open key std-table-close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std-table-open  = %x5B ws     ; [ Left square bracket
 | 
				
			||||||
 | 
					std-table-close = ws %x5D     ; ] Right square bracket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Inline Table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline-table = inline-table-open [ inline-table-keyvals ] ws-comment-newline inline-table-close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline-table-open  = %x7B  ; {
 | 
				
			||||||
 | 
					inline-table-close = %x7D  ; }
 | 
				
			||||||
 | 
					inline-table-sep   = %x2C  ; , Comma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline-table-keyvals =  ws-comment-newline keyval ws-comment-newline inline-table-sep inline-table-keyvals
 | 
				
			||||||
 | 
					inline-table-keyvals =/ ws-comment-newline keyval ws-comment-newline [ inline-table-sep ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Array Table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					array-table = array-table-open key array-table-close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					array-table-open  = %x5B.5B ws  ; [[ Double left square bracket
 | 
				
			||||||
 | 
					array-table-close = ws %x5D.5D  ; ]] Double right square bracket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Built-in ABNF terms, reproduced here for clarity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
 | 
				
			||||||
 | 
					DIGIT = %x30-39 ; 0-9
 | 
				
			||||||
 | 
					HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
 | 
				
			||||||
							
								
								
									
										0
									
								
								src/gleam-prod-javascript.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/gleam-prod-javascript.lock
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										1089
									
								
								src/gltoml.gleam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1089
									
								
								src/gltoml.gleam
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										46
									
								
								test/gltoml_test.gleam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								test/gltoml_test.gleam
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					import gleam/list
 | 
				
			||||||
 | 
					import gleam/string
 | 
				
			||||||
 | 
					import gltoml
 | 
				
			||||||
 | 
					import simplifile
 | 
				
			||||||
 | 
					import startest
 | 
				
			||||||
 | 
					import startest/expect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn main() -> Nil {
 | 
				
			||||||
 | 
					  startest.run(startest.default_config())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// gleeunit test functions end in `_test`
 | 
				
			||||||
 | 
					pub fn files_tests() {
 | 
				
			||||||
 | 
					  let assert Ok(test_file) =
 | 
				
			||||||
 | 
					    simplifile.read("./toml-test/tests/files-toml-1.1.0")
 | 
				
			||||||
 | 
					  let files =
 | 
				
			||||||
 | 
					    string.split(test_file, "\n")
 | 
				
			||||||
 | 
					    |> list.filter(fn(filename) { string.ends_with(filename, ".toml") })
 | 
				
			||||||
 | 
					    // We need to omit the encoding tests because these generally require a different method to
 | 
				
			||||||
 | 
					    // load as simplifile doesn't appear to open non-valid utf 8/16 files
 | 
				
			||||||
 | 
					    |> list.filter(fn(filename) {
 | 
				
			||||||
 | 
					      !string.starts_with(filename, "invalid/encoding")
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  files |> list.length |> echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  list.map(files, fn(filename) {
 | 
				
			||||||
 | 
					    startest.it(filename, fn() {
 | 
				
			||||||
 | 
					      let toml =
 | 
				
			||||||
 | 
					        simplifile.read("./toml-test/tests/" <> filename) |> expect.to_be_ok
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let tom = gltoml.parse(toml)
 | 
				
			||||||
 | 
					      case filename {
 | 
				
			||||||
 | 
					        "valid/" <> _ -> {
 | 
				
			||||||
 | 
					          expect.to_be_ok(tom)
 | 
				
			||||||
 | 
					          Nil
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        "invalid/" <> _ -> {
 | 
				
			||||||
 | 
					          expect.to_be_error(tom)
 | 
				
			||||||
 | 
					          Nil
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        _ -> Nil
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  |> startest.describe("files test", _)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										16
									
								
								test/scratch.gleam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								test/scratch.gleam
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					import gleam/string
 | 
				
			||||||
 | 
					import gleam/time/calendar
 | 
				
			||||||
 | 
					import gltoml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn main() {
 | 
				
			||||||
 | 
					  calendar.Date(25, calendar.March, 2025)
 | 
				
			||||||
 | 
					  |> echo
 | 
				
			||||||
 | 
					  |> calendar.is_valid_date
 | 
				
			||||||
 | 
					  |> echo
 | 
				
			||||||
 | 
					  gltoml.parse(
 | 
				
			||||||
 | 
					    //"#hello\n   'a.b' = '1'\nc = true\ng=2025-03-25T10:03:23.500000000+01:00\nh=12308_123\ni=-2\nf = 0o751\nd=0b1_1_0_1\ne=0x1ab_4ef\nj=-nan\nk=1.5e2",
 | 
				
			||||||
 | 
					    // "tab = { inner.table = [{}], inner.table.val = \"bad\" }",
 | 
				
			||||||
 | 
					    "a = {   a.b  =  1   }",
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					  |> echo
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								toml-test
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								toml-test
									
									
									
									
									
										Submodule
									
								
							 Submodule toml-test added at 1d35870ef6
									
								
							
		Reference in New Issue
	
	Block a user