{"id":16645587,"url":"https://github.com/boolangery/d-automapper","last_synced_at":"2026-02-16T00:01:47.162Z","repository":{"id":87083961,"uuid":"165710770","full_name":"boolangery/d-automapper","owner":"boolangery","description":"Compile-time generated object mapper for D","archived":false,"fork":false,"pushed_at":"2019-01-24T20:11:36.000Z","size":87,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-06T07:55:40.414Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"D","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/boolangery.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":"2019-01-14T18:13:19.000Z","updated_at":"2020-05-10T15:15:20.000Z","dependencies_parsed_at":"2023-03-03T00:15:20.628Z","dependency_job_id":null,"html_url":"https://github.com/boolangery/d-automapper","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/boolangery/d-automapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boolangery%2Fd-automapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boolangery%2Fd-automapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boolangery%2Fd-automapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boolangery%2Fd-automapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/boolangery","download_url":"https://codeload.github.com/boolangery/d-automapper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boolangery%2Fd-automapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29494177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T00:00:57.352Z","status":"ssl_error","status_checked_at":"2026-02-15T23:56:34.338Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2024-10-12T08:24:22.726Z","updated_at":"2026-02-16T00:01:47.080Z","avatar_url":"https://github.com/boolangery.png","language":"D","funding_links":[],"categories":[],"sub_categories":[],"readme":"## AutoMapper\n[AutoMapper](https://github.com/boolangery/d-automapper) is an object-object mapper for D like C# AutoMapper.\n\nIt use compile-time generated mapper to try to avoid any overhead.\n\nYou can run the benchmark located in `tests/benchmark`:\n\n```bash\n$ cd tests/benchmark\n$ dub test\n```\n\n## Build documentation\n\nThis project is well documented:\n\n```bash\n$ dub build --build=ddox\n```\n\n## Full exemple\n```D\nimport std.stdio;\nimport automapper;\n\nclass Order\n{\n    Customer customer;\n    Product product;\n}\n\nclass Product\n{\n    float price;\n    string name;\n}\n\nclass Customer\n{\n    string name;\n    string city;\n    string email;\n}\n\nclass OrderDTO\n{\n    string customerName;\n    string customerCity;\n    string customerEmail;\n    float productPrice;\n    string productName;\n}\n\nauto makeOrder()\n{\n    auto order = new Order();\n    order.customer = new Customer();\n    order.customer.name = \"boolangery\";\n    order.customer.city = \"Annecy\";\n    order.customer.email = \"foo.bar@gmail.com\";\n    order.product = new Product();\n    order.product.price = 42;\n    order.product.name = \"universe\";\n    return order;\n}\n\n\nvoid main()\n{\n    // create a compile-time generated mapper to map from Order to OrderDTO,\n    // and from OrderDTO to Order.\n    auto mapper = MapperConfiguration!(\n        CreateMap!(Order, OrderDTO)\n            .ReverseMap!())\n            .createMapper();\n\n    auto initial = makeOrder();\n    auto dto     = mapper.map!OrderDTO(initial); // map Order to OrderDTO\n    auto order   = mapper.map!Order(dto); // map back OrderDTO to Order\n\n    assert(order.customer.name  == initial.customer.name);\n    assert(order.customer.city  == initial.customer.city);\n    assert(order.customer.email == initial.customer.email);\n    assert(order.product.price  == initial.product.price);\n    assert(order.product.name   == initial.product.name);\n\n    // more suitable runtime mapper\n    RuntimeAutoMapper m = mapper.createRuntimeContext();\n}\n```\n\n## Run Time\n\nTo be as fast as possible, AutoMapper do by deafult all its magic at compile-time (See example bellow).\nMapping check are static asserted.\n\nIt implies that AutoMapper type is specialized using templates:\n\n```D\nalias AM = AutoMapper!(MapperConfiguration!(CreateMap!(Order, OrderDTO, ReverseMapConfig)));\n\nAM mapper = MapperConfiguration!(\n        CreateMap!(Order, OrderDTO)\n            .ReverseMap!())\n            .createMapper();\n```\n\nIt may be difficult to pass this complex object along your framework. Its why you can use\na slower version, that check things at runtime. \n\nThe example above became:\n\n```D\nRuntimeAutoMapper mapper = MapperConfiguration!(\n        CreateMap!(Order, OrderDTO)\n            .ReverseMap!())\n            .createMapper()\n            .createRuntimeContext();\n```\n\n## Custom member mapping\n\n```D\nimport automapper;\nimport std.datetime;\n\nclass A {\n    long timestamp;\n}\n\nclass B {\n    SysTime timestamp;\n}\n\nauto am = MapperConfiguration!(\n    CreateMap!(long, SysTime)\n        .ConvertUsing!((long ts) =\u003e SysTime(ts)),\n    CreateMap!(A, B))\n        .createMapper();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboolangery%2Fd-automapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboolangery%2Fd-automapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboolangery%2Fd-automapper/lists"}