{"id":19715688,"url":"https://github.com/mickaelblet/conf","last_synced_at":"2025-02-27T16:45:04.413Z","repository":{"id":101617804,"uuid":"121958196","full_name":"MickaelBlet/Conf","owner":"MickaelBlet","description":"Config load and dump library","archived":false,"fork":false,"pushed_at":"2024-04-21T21:15:36.000Z","size":181,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-10T15:18:14.704Z","etag":null,"topics":["cpp","cpp98-compatible"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MickaelBlet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-02-18T14:17:02.000Z","updated_at":"2024-04-21T21:15:40.000Z","dependencies_parsed_at":"2023-10-16T14:10:06.119Z","dependency_job_id":"b0a555e8-d4a7-4b86-869b-f264edf6447b","html_url":"https://github.com/MickaelBlet/Conf","commit_stats":null,"previous_names":["mickaelblet/conf"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FConf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FConf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FConf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MickaelBlet%2FConf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MickaelBlet","download_url":"https://codeload.github.com/MickaelBlet/Conf/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241036339,"owners_count":19898145,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","cpp98-compatible"],"created_at":"2024-11-11T22:39:07.945Z","updated_at":"2025-02-27T16:45:04.395Z","avatar_url":"https://github.com/MickaelBlet.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Conf\n\nConfig load and dump library  \nHeader only library at [single_include/blet/conf.h](single_include/blet/conf.h).  \nExamples at [docs/examples.md](docs/examples.md)\n\n## Quickstart\n\n```ini\n# ------------------------------------\n# Content of ./example/quickstart.conf\n# ------------------------------------\n\n; basic ini format (with support spaces)\n[foo]\n0 = Null  ; icase null\n1 = true  ; icase boolean (format: true,false | on,off | yes,no)\n2 = 42.42 ; number double (format: binary{0b10101}, octal{042}, hexadecimal{0xFF})\n3 = \"str\" ; string\n; multi ini section\n[[ nextLevel ]]\nfoo = bar\n; array ini value\n[bar]\nfoo[] = 0b0001 ; 1\nfoo[] = 0b0010 ; 2\nfoo[] = 0b0011 ; 3\n; map ini value with re-use key\n[foo]\n4[foo][bar] = 052 ; 42\n; inline multi section with re-use key\n[foo][nextLevel]\n\"bar\" = \"escape character\\n\\tstart newline with tab\"\n; use default section\n[]\n; pseudo json\nparents[] = {\n    name = brian\n    age = 42\n    gender = M\n    childs = [\n        {\n            name = toto\n            age = 2\n            gender = M\n        }\n        {\n            name = titi\n            age = 4\n            gender = F\n        }\n        {\n            name = tutu\n            age = 0.5\n            gender = F\n        }\n    ]\n}\n# json\nparents[] = {\n    \"name\": \"toto\",\n    \"age\": 0x2A,\n    \"gender\": \"M\",\n    \"childs\": []\n}\n; pseudo json one line\nparents[] = { name = clara, age = 42, gender = F, childs = [], emptyObj = {} }\n```\n```cpp\nconst blet::Dict conf = blet::conf::loadFile(\"./example/quickstart.conf\");\n\nstd::cout \u003c\u003c conf[\"foo\"][\"0\"] \u003c\u003c std::endl; // null\nstd::cout \u003c\u003c conf[\"foo\"][\"1\"] \u003c\u003c std::endl; // true\nstd::cout \u003c\u003c conf[\"foo\"][\"2\"] \u003c\u003c std::endl; // 42.42\nstd::cout \u003c\u003c conf[\"foo\"][\"3\"] \u003c\u003c std::endl; // str\nstd::cout \u003c\u003c conf[\"foo\"][\"nextLevel\"][\"foo\"] \u003c\u003c std::endl; // bar\nstd::cout \u003c\u003c conf[\"foo\"][\"nextLevel\"][\"bar\"] \u003c\u003c std::endl; // escape character\nstd::cout \u003c\u003c conf[\"bar\"][\"foo\"][0] \u003c\u003c std::endl; // 1\nstd::cout \u003c\u003c conf[\"bar\"][\"foo\"][1] \u003c\u003c std::endl; // 2\nstd::cout \u003c\u003c conf[\"bar\"][\"foo\"][2] \u003c\u003c std::endl; // 3\n\nstd::cout \u003c\u003c conf[\"foo\"][\"4\"][\"foo\"][\"bar\"] \u003c\u003c std::endl; // 42\n\nconst blet::Dict\u0026 parents = conf[\"parents\"];\nfor (std::size_t i = 0; i \u003c parents.size(); ++i) {\n    const std::string parentName = parents[i][\"name\"];\n    const int parentAge = parents[i][\"age\"];\n    const char parentGender = parents[i][\"gender\"].getString()[0];\n    std::cout \u003c\u003c parentName \u003c\u003c std::endl;\n    std::cout \u003c\u003c parentAge \u003c\u003c std::endl;\n    std::cout \u003c\u003c parentGender \u003c\u003c std::endl;\n    const blet::Dict\u0026 childs = parents[i][\"childs\"];\n    for (std::size_t j = 0; j \u003c childs.size(); ++j) {\n        const std::string childName = childs[j][\"name\"];\n        const int childAge = childs[j][\"age\"];\n        const char childGender = childs[j][\"gender\"].getString()[0];\n        std::cout \u003c\u003c childName \u003c\u003c std::endl;   // toto, titi, tutu\n        std::cout \u003c\u003c childAge \u003c\u003c std::endl;    // 2, 4, 0.5\n        std::cout \u003c\u003c childGender \u003c\u003c std::endl; // M, F, F\n    }\n}\n\nstd::cout \u003c\u003c blet::conf::dump(conf, 2) \u003c\u003c std::endl;\n// output:\n// parents[] = {\n//   age = 42,\n//   childs = [\n//     {\n//       age = 2,\n//       gender = \"M\",\n//       name = \"toto\"\n//     },\n//     {\n//       age = 4,\n//       gender = \"F\",\n//       name = \"titi\"\n//     },\n//     {\n//       age = 0.5,\n//       gender = \"F\",\n//       name = \"tutu\"\n//     }\n//   ],\n//   gender = \"M\",\n//   name = \"brian\"\n// }\n// parents[] = {\n//   age = 42,\n//   childs = [],\n//   gender = \"M\",\n//   name = \"toto\"\n// }\n// parents[] = {\n//   age = 42,\n//   childs = [],\n//   emptyObj = {},\n//   gender = \"F\",\n//   name = \"clara\"\n// }\n// [bar]\n// foo[] = 1\n// foo[] = 2\n// foo[] = 3\n// [foo]\n// 0 = null\n// 1 = true\n// 2 = 42.42\n// 3 = \"str\"\n// [[4]]\n// [[[foo]]]\n// bar = 42\n// [[nextLevel]]\n// bar = \"escape character\\n\\tstart newline with tab\"\n// foo = \"bar\"\nstd::cout \u003c\u003c blet::conf::dump(conf, 2, ' ', blet::conf::JSON_STYLE) \u003c\u003c std::endl;\n// output:\n// bar = {\n//   foo = [\n//     1,\n//     2,\n//     3\n//   ]\n// }\n// foo = {\n//   0 = null,\n//   1 = true,\n//   2 = 42.42,\n//   3 = \"str\",\n//   4 = {\n//     foo = {\n//       bar = 42\n//     }\n//   },\n//   nextLevel = {\n//     bar = \"escape character\\n\\tstart newline with tab\",\n//     foo = \"bar\"\n//   }\n// }\n// parents = [\n//   {\n//     age = 42,\n//     childs = [\n//       {\n//         age = 2,\n//         gender = \"M\",\n//         name = \"toto\"\n//       },\n//       {\n//         age = 4,\n//         gender = \"F\",\n//         name = \"titi\"\n//       },\n//       {\n//         age = 0.5,\n//         gender = \"F\",\n//         name = \"tutu\"\n//       }\n//     ],\n//     gender = \"M\",\n//     name = \"brian\"\n//   },\n//   {\n//     age = 42,\n//     childs = [],\n//     gender = \"M\",\n//     name = \"toto\"\n//   },\n//   {\n//     age = 42,\n//     childs = [],\n//     emptyObj = {},\n//     gender = \"F\",\n//     name = \"clara\"\n//   }\n// ]\n```\n\n## Build\n```bash\n# Static Release\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n# Dynamic Release\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n\n# Static Release C++98\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=98 -DBUILD_SHARED_LIBS=0 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n# Dynamic Release C++98\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=98 -DBUILD_SHARED_LIBS=1 .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n\n# Install with custom directory\nmkdir build; pushd build; cmake -DCMAKE_INSTALL_PREFIX=\"YOUR_INSTALL_PATH\" .. \u0026\u0026 make -j \u0026\u0026 make install; popd\n\n# Example + Tests + Coverage\nmkdir build; pushd build; cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_EXAMPLE=1 -DBUILD_TESTING=1 -DBUILD_COVERAGE=1 -DCMAKE_CXX_STANDARD=98 .. \u0026\u0026 make -j \u0026\u0026 make test -j; popd\n```\n\n## Load Functions\n\n### loadFile\n\n```cpp\nblet::Dict loadFile(const char* filename);\n```\nTake a path of configuration file and load them for create a Dict object.  \nExample at [docs/examples.md#loadFile](docs/examples.md#loadfile).\n\n### loadStream\n\n```cpp\nblet::Dict loadStream(std::istream\u0026 stream);\n```\n\nTake a std::istream and load them for create a Dict object.  \nExample at [docs/examples.md#loadStream](docs/examples.md#loadstream).\n\n### loadString\n\n```cpp\nblet::Dict loadString(const std::string\u0026 str);\n```\n\nTake a std::string and load them for create a Dict object.  \nExample at [docs/examples.md#loadString](docs/examples.md#loadstring).\n\n### loadData\n\n```cpp\nblet::Dict loadData(const void* data, std::size_t size);\n```\n\nTake a data and size and load them for create a Dict object.  \nExample at [docs/examples.md#loadData](docs/examples.md#loaddata).\n\n## Dump Functions\n\n### Dump\n\n``` cpp\nvoid dump(const blet::Dict\u0026 dict, std::ostream\u0026 os, std::size_t indent = 0, char indentCharacter = ' ', enum blet::conf::EDumpStyle style = blet::conf::CONF_STYLE);\n```\n\nDump from a Dict to configuration format in stream.  \nYou can set the `indent` and `indentCharacter` and `style` with `CONF_STYLE` or `JSON_STYLE` for better formatting.  \nExample at [docs/examples.md#DumpStream](docs/examples.md#dumpstream).\n\n``` cpp\nstd::string dump(const blet::Dict\u0026 dict, std::size_t indent = 0, char indentCharacter = ' ', enum blet::conf::EDumpStyle style = blet::conf::CONF_STYLE);\n```\n\nDump from a Dict to configuration format in string.  \nYou can set the `indent` and `indentCharacter` and `style` with `CONF_STYLE` or `JSON_STYLE` for better formatting.  \nExample at [docs/examples.md#DumpStream](docs/examples.md#dumpstring).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmickaelblet%2Fconf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmickaelblet%2Fconf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmickaelblet%2Fconf/lists"}