{"id":20441409,"url":"https://github.com/sandromaglione/parser_entities_models","last_synced_at":"2026-04-11T06:02:06.076Z","repository":{"id":121157752,"uuid":"324192827","full_name":"SandroMaglione/parser_entities_models","owner":"SandroMaglione","description":"Parser written with Ohm which converts a definition file to models and entities classes in `.dart` for Flutter projects. Simply define the attributes and their type, and the application will generate the complete nested file structure for you.","archived":false,"fork":false,"pushed_at":"2020-12-24T17:08:05.000Z","size":18,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-05T07:46:11.906Z","etag":null,"topics":["compiler","compiler-construction","dart","dartlang","flutter","grammar","grammar-checker","grammar-parser","javascript","ohm","ohmjs","package"],"latest_commit_sha":null,"homepage":"https://www.sandromaglione.com/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SandroMaglione.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,"publiccode":null,"codemeta":null}},"created_at":"2020-12-24T16:10:43.000Z","updated_at":"2024-04-27T08:11:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"9a66aacb-bc97-4827-9b73-4ba2854f76fb","html_url":"https://github.com/SandroMaglione/parser_entities_models","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/SandroMaglione/parser_entities_models","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SandroMaglione%2Fparser_entities_models","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SandroMaglione%2Fparser_entities_models/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SandroMaglione%2Fparser_entities_models/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SandroMaglione%2Fparser_entities_models/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SandroMaglione","download_url":"https://codeload.github.com/SandroMaglione/parser_entities_models/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SandroMaglione%2Fparser_entities_models/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265222973,"owners_count":23730327,"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":["compiler","compiler-construction","dart","dartlang","flutter","grammar","grammar-checker","grammar-parser","javascript","ohm","ohmjs","package"],"created_at":"2024-11-15T09:32:37.566Z","updated_at":"2025-12-30T22:07:38.872Z","avatar_url":"https://github.com/SandroMaglione.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Parser Entities/Models Flutter\n\u003cp\u003e\n  \u003cimg src=\"https://img.shields.io/badge/version-0.1.0-blue.svg\" /\u003e\n  \u003ca href=\"https://github.com/SandroMaglione\"\u003e\n    \u003cimg alt=\"GitHub: SandroMaglione\" src=\"https://img.shields.io/github/followers/SandroMaglione?label=Follow\u0026style=social\" target=\"_blank\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://twitter.com/SandroMaglione\"\u003e\n    \u003cimg alt=\"Twitter: SandroMaglione\" src=\"https://img.shields.io/twitter/follow/SandroMaglione.svg?style=social\" target=\"_blank\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\nParser written with [Ohm](https://github.com/harc/ohm) which converts a definition file to models and entities classes `.dart` for Flutter projects.\n\n***\n\n## How to use\n1. Write the source files inside the `sources` folder\n2. `npm run start`\n3. The file will be generated inside a new `dist` folder\n\n## How it works\nThe `sources` folder contains the definition of the classes to generate. Each folder created inside `sources` will be created with the same name inside the generated `dist` folder.\n\nCreate a new folder inside `sources` and write a `.txt` file that defines the class to generate.\n\nFinally, run the script:\n```shell\nnpm run start\n```\nAll the files will be generated inside a newly created `dist` folder. The files are then separated in an `entities` and `models` folders. Copy-Paste them in your Flutter project.\n\n***\n\n## Grammar\nAll the example are available in the `sources/example` folder. Just run `npm run start` to generate the `.dart` files.\n\n### Class definition\nWrap classes definition inside braces, then write the name of the class **capitalized** and in **`pascalCase`**, and write the parameters inside curly braces:\n```\n(\n    NameOfClass {\n        ...\n    }\n)\n```\n\n### Parameter (only entity)\nEach parameter defines a required **name** and a **type** for the entity, with **`:`** in between them and closed by a **`;`**. In this case, the model will have the same name and type.\n```\n(\n    OnlyEntity {\n        id: int;\n    }\n)\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class OnlyEntity extends Equatable {\n  const OnlyEntity();\n\n  int get id;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [];\n}\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'only_entity_model.g.dart';\n\n@JsonSerializable()\nclass OnlyEntityModel extends OnlyEntity {\n  @override\n  final int id;\n\n  const OnlyEntityModel({\n    @required this.id,\n  });\n\n  factory OnlyEntityModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$OnlyEntityModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$OnlyEntityModelToJson(this);\n\n}\n```\n\n### Entity Equatable props\nAdd **`*`** as prefix to the entity name to add the parameter to the `props` list of Equatable.\n```\n(\n    WithProps {\n        *id: int;\n    }\n)\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class WithProps extends Equatable {\n  const WithProps();\n\n  int get id;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [id,];\n}\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'with_props_model.g.dart';\n\n@JsonSerializable()\nclass WithPropsModel extends WithProps {\n  @override\n  final int id;\n\n  const WithPropsModel({\n    @required this.id,\n  });\n\n  factory WithPropsModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$WithPropsModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$WithPropsModelToJson(this);\n\n}\n```\n\n### Parameter (entity+model)\nTo define a different name and/or type for the model, add a **`,`** after the entity name and use the same formalism as before to define the model name and (optionally) the model type. In this case, the model will have a different name and, in case of different type, the user must define an implementation to convert the parameter of the model to the parameter of the entity.\n```\n(\n    EntityModel {\n        isFeatured: bool, featured: int;\n    }\n)\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class EntityModel extends Equatable {\n  const EntityModel();\n\n  bool get isFeatured;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [];\n}\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'entity_model_model.g.dart';\n\n@JsonSerializable()\nclass EntityModelModel extends EntityModel {\n  final int featured;\n\n  const EntityModelModel({\n    @required this.featured,\n  });\n\n  factory EntityModelModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$EntityModelModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$EntityModelModelToJson(this);\n\n  @override\n  bool get isFeatured =\u003e null /* TODO: featured */;\n}\n```\n\n### Optional parameter\nAdd **`?`** after the entity name to make the parameter optional. In this case, an `-Option` suffix will be added to the entity name and the entity type will be `Option\u003cT\u003e`. The model will override the entity parameter by using `optionOf()`.\n```\n(\n    Optional {\n        name?: String;\n    }\n)\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class Optional extends Equatable {\n  const Optional();\n\n  Option\u003cString\u003e get nameOption;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [];\n}\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'optional_model.g.dart';\n\n@JsonSerializable()\nclass OptionalModel extends Optional {\n  final String name;\n\n  const OptionalModel({\n    this.name,\n  });\n\n  factory OptionalModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$OptionalModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$OptionalModelToJson(this);\n\n  @override\n  Option\u003cString\u003e get nameOption =\u003e optionOf(name);\n}\n```\n\n### Parameters list\nAdd **`!`** after the entity name to make the parameter a list. In this case, an `-List` suffix will be added to the entity name and the entity type will be `IList\u003cT\u003e`. The model will override the entity parameter by using `ilist()`.\n```\n(\n    ListParams {\n        address!: String;\n    }\n)\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class ListParams extends Equatable {\n  const ListParams();\n\n  IList\u003cString\u003e get addressList;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [];\n}\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'list_params_model.g.dart';\n\n@JsonSerializable()\nclass ListParamsModel extends ListParams {\n  final List\u003cString\u003e address;\n\n  const ListParamsModel({\n    @required this.address,\n  });\n\n  factory ListParamsModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$ListParamsModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$ListParamsModelToJson(this);\n\n  @override\n  IList\u003cString\u003e get addressList =\u003e ilist(address);\n}\n```\n\n### Nesting classes\nClasses can be nested as many time as needed. To generate a nested class just **make the entity type a class definition**. The entity will have the type of the nested class and the nested class itself will be generated in a separate file.\n```\n(\n    Nested {\n        subClass: (\n            SubClass {\n                id: int;\n            }\n        );\n    }\n)\n```\n```dart\n/// Source class\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class Nested extends Equatable {\n  const Nested();\n\n  SubClass get subClass;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [];\n}\n\n/// Sub class (in separate file)\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class SubClass extends Equatable {\n  const SubClass();\n\n  int get id;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [];\n}\n```\n```dart\n/// Source class\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'nested_model.g.dart';\n\n@JsonSerializable()\nclass NestedModel extends Nested {\n  @override\n  final SubClassModel subClass;\n\n  const NestedModel({\n    @required this.subClass,\n  });\n\n  factory NestedModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$NestedModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$NestedModelToJson(this);\n\n}\n\n/// Sub class (in separate file)\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'sub_class_model.g.dart';\n\n@JsonSerializable()\nclass SubClassModel extends SubClass {\n  @override\n  final int id;\n\n  const SubClassModel({\n    @required this.id,\n  });\n\n  factory SubClassModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$SubClassModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$SubClassModelToJson(this);\n\n}\n```\n\n### Complete example\nThe following example shows all the possible cases currently supported by the compiler.\n```\n(\n    Complete {\n        onlyE: int;\n        onlyEOpt?: int;\n        onlyELst!: int;\n        mOnlyName: int, m_only_name;\n        mOnlyNameOpt?: int, m_only_name_opt;\n        mOnlyNameLst!: int, m_only_name_lst;\n        mType: int, m_type: String;\n        mTypeOpt?: int, m_type_opt: String;\n        mTypeLst!: int, m_type_lst: String;\n        onlyESub: (Sub{id:int;});\n        onlyESubOpt?: (Sub{id:int;});\n        onlyESubLst!: (Sub{id:int;});\n        mOnlyNameSub: (Sub{id:int;}), m_only_name_sub;\n        mOnlyNameSubOpt?: (Sub{id:int;}), m_only_name_sub_opt;\n        mOnlyNameSubLst!: (Sub{id:int;}), m_only_name_sub_lst;\n        mTypeSub: (Sub{id:int;}), m_type_sub: String;\n        mTypeSubOpt?: (Sub{id:int;}), m_type_sub_opt: String;\n        mTypeSubLst!: (Sub{id:int;}), m_type_sub_lst: String;\n    }\n)\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nabstract class Complete extends Equatable {\n  const Complete();\n\n  int get onlyE;\n  Option\u003cint\u003e get onlyEOptOption;\n  IList\u003cint\u003e get onlyELstList;\n  int get mOnlyName;\n  Option\u003cint\u003e get mOnlyNameOptOption;\n  IList\u003cint\u003e get mOnlyNameLstList;\n  int get mType;\n  Option\u003cint\u003e get mTypeOptOption;\n  IList\u003cint\u003e get mTypeLstList;\n  Sub get onlyESub;\n  Option\u003cSub\u003e get onlyESubOptOption;\n  IList\u003cSub\u003e get onlyESubLstList;\n  Sub get mOnlyNameSub;\n  Option\u003cSub\u003e get mOnlyNameSubOptOption;\n  IList\u003cSub\u003e get mOnlyNameSubLstList;\n  Sub get mTypeSub;\n  Option\u003cSub\u003e get mTypeSubOptOption;\n  IList\u003cSub\u003e get mTypeSubLstList;\n\n  @override\n  List\u003cObject\u003e get props =\u003e [];\n}\n```\n```dart\nimport 'package:dartz/dartz.dart';\nimport 'package:json_annotation/json_annotation.dart';\nimport 'package:meta/meta.dart';\n\npart 'complete_model.g.dart';\n\n@JsonSerializable()\nclass CompleteModel extends Complete {\n  @override\n  final int onlyE;\n  @override\n  final SubModel onlyESub;\n  final int onlyEOpt;\n  final List\u003cint\u003e onlyELst;\n  final int m_only_name;\n  final int m_only_name_opt;\n  final List\u003cint\u003e m_only_name_lst;\n  final String m_type;\n  final String m_type_opt;\n  final List\u003cString\u003e m_type_lst;\n  final SubModel onlyESubOpt;\n  final List\u003cSubModel\u003e onlyESubLst;\n  final SubModel m_only_name_sub;\n  final SubModel m_only_name_sub_opt;\n  final List\u003cSubModel\u003e m_only_name_sub_lst;\n  final String m_type_sub;\n  final String m_type_sub_opt;\n  final List\u003cString\u003e m_type_sub_lst;\n\n  const CompleteModel({\n    @required this.onlyE,\n    @required this.onlyELst,\n    @required this.m_only_name,\n    @required this.m_only_name_lst,\n    @required this.m_type,\n    @required this.m_type_lst,\n    @required this.onlyESub,\n    @required this.onlyESubLst,\n    @required this.m_only_name_sub,\n    @required this.m_only_name_sub_lst,\n    @required this.m_type_sub,\n    @required this.m_type_sub_lst,\n    this.onlyEOpt,\n    this.m_only_name_opt,\n    this.m_type_opt,\n    this.onlyESubOpt,\n    this.m_only_name_sub_opt,\n    this.m_type_sub_opt,\n  });\n\n  factory CompleteModel.fromJson(Map\u003cString, dynamic\u003e json) =\u003e\n      _$CompleteModelFromJson(json);\n  Map\u003cString, dynamic\u003e toJson() =\u003e _$CompleteModelToJson(this);\n\n  @override\n  Option\u003cint\u003e get onlyEOptOption =\u003e optionOf(onlyEOpt);\n\n  @override\n  IList\u003cint\u003e get onlyELstList =\u003e ilist(onlyELst);\n\n  @override\n  int get mOnlyName =\u003e m_only_name;\n\n  @override\n  Option\u003cint\u003e get mOnlyNameOptOption =\u003e optionOf(m_only_name_opt);\n\n  @override\n  IList\u003cint\u003e get mOnlyNameLstList =\u003e ilist(m_only_name_lst);\n\n  @override\n  int get mType =\u003e null /* TODO: m_type */;\n\n  @override\n  Option\u003cint\u003e get mTypeOptOption =\u003e optionOf(null /* TODO: m_type_opt */);\n\n  @override\n  IList\u003cint\u003e get mTypeLstList =\u003e ilist(null /* TODO: m_type_lst */);\n\n  @override\n  Option\u003cSub\u003e get onlyESubOptOption =\u003e optionOf(onlyESubOpt);\n\n  @override\n  IList\u003cSub\u003e get onlyESubLstList =\u003e ilist(onlyESubLst);\n\n  @override\n  Sub get mOnlyNameSub =\u003e m_only_name_sub;\n\n  @override\n  Option\u003cSub\u003e get mOnlyNameSubOptOption =\u003e optionOf(m_only_name_sub_opt);\n\n  @override\n  IList\u003cSub\u003e get mOnlyNameSubLstList =\u003e ilist(m_only_name_sub_lst);\n\n  @override\n  Sub get mTypeSub =\u003e null /* TODO: m_type_sub */;\n\n  @override\n  Option\u003cSub\u003e get mTypeSubOptOption =\u003e optionOf(null /* TODO: m_type_sub_opt */);\n\n  @override\n  IList\u003cSub\u003e get mTypeSubLstList =\u003e ilist(null /* TODO: m_type_sub_lst */);\n}\n```\n\n## Releases\n- 24 December 2020, 18:05 | Initial release","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsandromaglione%2Fparser_entities_models","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsandromaglione%2Fparser_entities_models","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsandromaglione%2Fparser_entities_models/lists"}