{"id":27060160,"url":"https://github.com/turtton/vodca","last_synced_at":"2025-10-08T23:35:05.008Z","repository":{"id":200246068,"uuid":"705113618","full_name":"turtton/vodca","owner":"turtton","description":"boiler-plate code generator in DDD","archived":false,"fork":false,"pushed_at":"2025-09-25T15:38:17.000Z","size":75,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-08T23:35:04.541Z","etag":null,"topics":["ddd-patterns","procedural-macros","rust-lang","rust-macros"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/turtton.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-10-15T04:02:30.000Z","updated_at":"2025-09-19T08:47:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"0b016806-e95f-4912-908e-7549eaa9ccaf","html_url":"https://github.com/turtton/vodca","commit_stats":null,"previous_names":["turtton/vodca"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/turtton/vodca","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtton%2Fvodca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtton%2Fvodca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtton%2Fvodca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtton%2Fvodca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/turtton","download_url":"https://codeload.github.com/turtton/vodca/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtton%2Fvodca/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000730,"owners_count":26082862,"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","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["ddd-patterns","procedural-macros","rust-lang","rust-macros"],"created_at":"2025-04-05T13:18:00.017Z","updated_at":"2025-10-08T23:35:04.993Z","avatar_url":"https://github.com/turtton.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# vodca\n\n[\u003cimg alt=\"crate.io\" src=\"https://img.shields.io/crates/v/vodca?label=crate.io\u0026logo=rust\u0026style=flat-square\"\u003e](https://crates.io/crates/vodca)\n[\u003cimg alt=\"GitHub Actions Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/turtton/vodca/check.yml?style=flat-square\"\u003e](https://github.com/turtton/vodca/actions/workflows/check.yml)\n\nvodca generates boiler-template codes in DDD\n\n## ValueObject\n\n### Fromln\n\n```rust\nuse vodca::Fromln;\n\n#[derive(Fromln)]\npub struct TupleStruct(String);\n\n/// generated by vodca\nimpl From\u003cTupleStruct\u003e for String {\n    fn from(value: TupleStruct) -\u003e Self {\n        value.0\n    }\n}\n\n///\n\nfn main() {\n    let ts = TupleStruct(\"Hello, world!\".to_string());\n    let parsed: String = ts.into();\n    assert_eq!(parsed, \"Hello, world!\");\n}\n```\n\n### AsRefln\n\n```rust\n\nuse vodca::AsRefln;\n\n#[derive(AsRefln)]\npub struct TupleStructString(String);\n\n/// generated by vodca\nimpl AsRef\u003cString\u003e for TupleStructString {\n    fn as_ref(\u0026self) -\u003e \u0026String {\n        \u0026self.0\n    }\n}\n\n///\n\nfn main() {\n    let ts_string = TupleStructString(\"Hello, world!\".to_string());\n    let str: \u0026str = ts_string.as_ref();\n    assert_eq!(str, \"Hello, world!\");\n}\n```\n\n## Entity\n\n### References\n\n```rust\n\nuse vodca::References;\n\n#[derive(References)]\npub struct Struct {\n    field_i32: i32,\n    field_string: String,\n    field_vec: Vec\u003ci32\u003e\n}\n\n/// generated by vodca\nimpl Struct {\n    pub fn field_i32(\u0026self) -\u003e \u0026i32 {\n        \u0026self.field_i32\n    }\n\n    pub fn field_string(\u0026self) -\u003e \u0026String {\n        \u0026self.field_string\n    }\n\n    pub fn field_vec(\u0026self) -\u003e \u0026Vec\u003ci32\u003e {\n        \u0026self.field_vec\n    }\n}\n\n///\n\nfn main() {\n    let s = Struct {\n        field_i32: 42,\n        field_string: \"Hello, world!\".to_string(),\n        field_vec: vec![1, 2, 3]\n    };\n\n    let i32 = s.field_i32();\n    assert_eq!(i32, \u002642);\n\n    let str: \u0026str = s.field_string();\n    assert_eq!(str, \"Hello, world!\");\n\n    let vec: \u0026[i32] = s.field_vec();\n    assert_eq!(vec, \u0026[1, 2, 3]);\n}\n```\n\n### Nameln\n\n```rust\n\nuse vodca::Nameln;\n\n#[derive(Nameln)]\npub enum Events\u003cT\u003e {\n    Created { id: i64 },\n    Updated(T),\n    Deleted,\n}\n\n/// generated by vodca\nimpl\u003cT\u003e Events\u003cT\u003e {\n    #[allow(unused_variables, non_snake_case)]\n    pub fn name(\u0026self) -\u003e String {\n        let name = match self {\n            Enum::Created { id: i64 } =\u003e \"Created\",\n            Enum::Updated(T) =\u003e \"Updated\",\n            Enum::Deleted =\u003e \"Deleted\",\n        };\n        name.to_string()\n    }\n}\n///\n\n#[derive(Newln)]\n#[vodca(prefix = \"action\", snake_case)]\npub enum InitAction {\n    NewGame,\n    Continue\n}\n\n/// generated by vodca\nimpl InitAction {\n    pub fn name(\u0026self) -\u003e String {\n        let name = match self {\n            InitAction::NewGame =\u003e \"action_new_game\",\n            InitAction::Continue =\u003e \"action_continue\",\n        };\n        name.to_string()\n    }\n}\n///\n\nfn main() {\n    let i64: Enum\u003ci64\u003e = Enum::Created { id: 42 };\n    let name = i64.name();\n    assert_eq!(name, \"Created\");\n\n    let generics = Enum::Updated(\"Hello, world!\".to_string());\n    let name = generics.name();\n    assert_eq!(name, \"Updated\");\n\n    let deleted: Enum\u003c\u0026str\u003e = Enum::Deleted;\n    let name = deleted.name();\n    assert_eq!(name, \"Deleted\");\n    \n    let new_game = InitAction::NewGame;\n    let name = new_game.name();\n    assert_eq!(name, \"action_new_game\");\n    \n    let cont = InitAction::Continue;\n    let name = cont.name();\n    assert_eq!(name, \"action_continue\");\n}\n```\n\n## Both\n\n### Newln\n\n```rust\n\nuse vodca::Newln;\n\n#[derive(Newln)]\npub struct TupleStruct(String);\n\n/// generated by vodca\nimpl TupleStruct {\n    pub fn new(value_0: impl Into\u003cString\u003e) -\u003e Self {\n        Self(value_0.into())\n    }\n}\n///\n\n#[derive(Newln)]\npub struct Struct {\n    field_i32: i32,\n    field_string: String,\n    field_vec: Vec\u003ci32\u003e\n}\n\n/// generated by vodca\nimpl Struct {\n    pub fn new(field_i32: i32, field_string: String, field_vec: Vec\u003ci32\u003e) -\u003e Self {\n        Self {\n            field_i32,\n            field_string,\n            field_vec\n        }\n    }\n}\n///\n\nfn main() {\n    let t = TupleStruct::new(\"Hello, world!\".to_string());\n    assert_eq!(t.0, \"Hello, world!\");\n    \n    let s = Struct::new(42, \"Hello, world!\".to_string(), vec![1, 2, 3]);\n    assert_eq!(s.field_i32, 42);\n    assert_eq!(s.field_string, \"Hello, world!\");\n    assert_eq!(s.field_vec, vec![1, 2, 3]);\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturtton%2Fvodca","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fturtton%2Fvodca","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturtton%2Fvodca/lists"}