{"id":17984444,"url":"https://github.com/ztrap/validate-mapper","last_synced_at":"2026-05-09T09:54:49.055Z","repository":{"id":57742860,"uuid":"229632474","full_name":"zTrap/validate-mapper","owner":"zTrap","description":"Powerful reflection-based data validator. Mostly used for mapping and validating network-layer models","archived":false,"fork":false,"pushed_at":"2021-03-14T21:31:57.000Z","size":105,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-09T13:42:29.562Z","etag":null,"topics":["android","java","kotlin","mapper","mappers","validation","validation-library"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zTrap.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}},"created_at":"2019-12-22T21:19:54.000Z","updated_at":"2021-03-15T21:41:35.000Z","dependencies_parsed_at":"2022-09-11T09:41:14.898Z","dependency_job_id":null,"html_url":"https://github.com/zTrap/validate-mapper","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zTrap%2Fvalidate-mapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zTrap%2Fvalidate-mapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zTrap%2Fvalidate-mapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zTrap%2Fvalidate-mapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zTrap","download_url":"https://codeload.github.com/zTrap/validate-mapper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247107827,"owners_count":20884797,"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":["android","java","kotlin","mapper","mappers","validation","validation-library"],"created_at":"2024-10-29T18:21:25.001Z","updated_at":"2026-05-09T09:54:48.978Z","avatar_url":"https://github.com/zTrap.png","language":"Kotlin","funding_links":["https://www.paypal.me/zTrap"],"categories":[],"sub_categories":[],"readme":"# Validation mapper\n\nPowerful reflection-based data validator. Mostly used for mapping and validating network-layer models\n\n## Install\n\nBase library [ ![Download](https://maven-badges.herokuapp.com/maven-central/ru.ztrap.tools/validate-mapper/badge.svg) ](https://maven-badges.herokuapp.com/maven-central/ru.ztrap.tools/validate-mapper/)\n\n```gradle\nimplementation \"ru.ztrap.tools:validate-mapper:${latestVersion}\"\n```\n\nCommon checks [ ![Download](https://maven-badges.herokuapp.com/maven-central/ru.ztrap.tools/validate-mapper-common/badge.svg) ](https://maven-badges.herokuapp.com/maven-central/ru.ztrap.tools/validate-mapper-common/)\n\n```gradle\nimplementation \"ru.ztrap.tools:validate-mapper-common:${latestVersion}\"\n```\n\nGson extension [ ![Download](https://maven-badges.herokuapp.com/maven-central/ru.ztrap.tools/validate-mapper-gson/badge.svg) ](https://maven-badges.herokuapp.com/maven-central/ru.ztrap.tools/validate-mapper-gson/)\n\n```gradle\nimplementation \"ru.ztrap.tools:validate-mapper-gson:${latestVersion}\"\n```\n\n## Usage\n\n### 1. Basics\n\nLet's imagine we have a simple `Message` model which contains `id`, `senderId`, `text` and `attachmentUrl`.\nFields `id` and `senderId` should not be empty or blank, `text` and `attachmentUrl` are not required and can be `null`. \nIn code, it will be represented like this:\n\n```kotlin\ndata class MessageNetworkEntity(\n    @Checks(NotBlankStringCheck::class)\n    val id: String?,\n    @Checks(NotBlankStringCheck::class)\n    val senderId: String?,\n    @Checks(NotBlankStringCheck::class)\n    val text: String?,\n    @NotRequired\n    val attachmentUrl: String?\n) {\n    companion object : ValidateMapper\u003cMessageNetworkEntity, MessageDomainEntity\u003e() {\n        override fun transform(raw: MessageNetworkEntity) = MessageDomainEntity(\n            id = requireNotNull(raw.id),\n            text = raw.text,\n            senderId = requireNotNull(raw.senderId),\n            attachmentUrl = raw.attachmentUrl\n        )\n    }\n}\n\ndata class MessageDomainEntity(\n    val id: String,\n    val text: String,\n    val senderId: String,\n    val attachmentUrl: String?\n)\n```\n\nWe can validate this network model with:\n\n```kotlin\nval networkMessage = MessageNetworkEntity(\n    id = \"7c0518f7-874d-4dd7-89b6-af0adf0699a1\",\n    senderId = \"347da584-9f8c-4b47-b912-f9f2af0a6417\",\n    text = \"Hello!\",\n    attachmentUrl = \"https://avatars.githubusercontent.com/u/18091396?s=460\u0026u=72fb5fb2f4d8a2ef3b6195ee371a130532656095\u0026v=4\"\n)\n\nval domainMessage = networkMessage.validateMap(MessageNetworkEntity)\n```\n\nIf some constraint is not met, `validateMap` will throw a `FailedValidationException` and provide detailed explanation of what is not met.\nExample:\n\n```kotlin\nval networkMessage = MessageNetworkEntity(\n    id = \"\",\n    senderId = \" \",\n    text = null,\n    attachmentUrl = \"https://avatars.githubusercontent.com/u/18091396?s=460\u0026u=72fb5fb2f4d8a2ef3b6195ee371a130532656095\u0026v=4\"\n)\n\nval domainMessage = networkMessage.validateMap(MessageNetworkEntity)\n```\n\nWill throw exception with following message:\n```\nru.ztrap.tools.validate.mapper.FailedValidationException: Failed validation of received object.\n    Object -\u003e MessageNetworkEntity(id=, senderId= , text=null, attachmentUrl=https://avatars.githubusercontent.com/u/18091396?s=460\u0026u=72fb5fb2f4d8a2ef3b6195ee371a130532656095\u0026v=4)\n    Params -\u003e id ------- Reasons -\u003e [{reason=\"empty string\"}],\n              senderId - Reasons -\u003e [{reason=\"blank string\"}],\n              text ----- Reasons -\u003e [{reason=\"value is null\"}]\n    ...\n```\n\n### 2. Parametrized checks\n\nYou can provide named parameters into any `ValidateChecker` via any of this annotations\n\n```kotlin\nannotation class StringParameter(val name: String, val value: String)\nannotation class ByteParameter(val name: String, val value: Byte)\nannotation class ShortParameter(val name: String, val value: Short)\nannotation class IntParameter(val name: String, val value: Int)\nannotation class LongParameter(val name: String, val value: Long)\nannotation class FloatParameter(val name: String, val value: Float)\nannotation class DoubleParameter(val name: String, val value: Double)\nannotation class KClassParameter(val name: String, val value: KClass\u003c*\u003e)\n```\n\nLet's add length checks to unique id fields:\n\n```kotlin\nprivate const val MAX_UUID_LENGTH = 36L\n\ndata class MessageNetworkEntity(\n    @CheckParametrized(\n        expressionClass = TrimmedStringLengthCheck::class,\n        long = [\n            CheckParametrized.LongParameter(TrimmedStringLengthCheck.MAX_LIMIT_LONG, MAX_UUID_LENGTH),\n            CheckParametrized.LongParameter(TrimmedStringLengthCheck.MIN_LIMIT_LONG, MAX_UUID_LENGTH)\n        ]\n    )\n    val id: String?,\n    @CheckParametrized(\n        expressionClass = TrimmedStringLengthCheck::class,\n        long = [\n            CheckParametrized.LongParameter(TrimmedStringLengthCheck.MAX_LIMIT_LONG, MAX_UUID_LENGTH),\n            CheckParametrized.LongParameter(TrimmedStringLengthCheck.MIN_LIMIT_LONG, MAX_UUID_LENGTH)\n        ]\n    )\n    val senderId: String?,\n    ...\n)\n```\n\nAnd validate:\n\n```kotlin\nval networkMessage = MessageNetworkEntity(\n    id = \"52b1c9c5-3cb2-41f0\", // invalid\n    senderId = \"52b1c9c5-3cb2-41f0-adff-1b0da5cffeee\",\n    text = null,\n    attachmentUrl = \"https://avatars.githubusercontent.com/u/18091396?s=460\u0026u=72fb5fb2f4d8a2ef3b6195ee371a130532656095\u0026v=4\"\n)\n\nval domainMessage = networkMessage.validateMap(MessageNetworkEntity)\n```\n\nAs result, we get thrown exception with following message:\n\n```\nru.ztrap.tools.validate.mapper.FailedValidationException: Failed validation of received object.\n    Object -\u003e MessageNetworkEntity(id=52b1c9c5-3cb2-41f0, senderId=52b1c9c5-3cb2-41f0-adff-1b0da5cffeee, text=null, attachmentUrl=https://avatars.githubusercontent.com/u/18091396?s=460\u0026u=72fb5fb2f4d8a2ef3b6195ee371a130532656095\u0026v=4)\n    Params -\u003e id - Reasons -\u003e [{reason=\"length not in limits\", values=[min_limit=36, max_limit=36, current_length=18]}]\n    ...\n```\n\n### 3. Global configuration\n\nYou can define checks for all fields with provided type. For example, we expect all strings can't be blank. \n\n```kotlin\nValidateMapper.addGlobalCheck(String::class, NotBlankStringCheck::class)\n```\n\nIn some cases you may want to exclude checks from global pool for some field. You can simply do this with:\n\n```kotlin\ndata class MessageNetworkEntity(\n    @ExcludeCkecks(NotBlankStringCheck::class)\n    val text: String?,\n    ...\n)\n```\n\nAlso, you can provide field name extractor. Actual for models parsed from json. \nExample you can find [here](https://github.com/zTrap/validate-mapper/blob/master/validate-mapper-gson/src/main/kotlin/ru/ztrap/tools/validate/gson/ValidateExtensionGson.kt)\n\n## Developed By\n\n- Peter Gulko\n- ztrap.developer@gmail.com\n- [paypal.me/zTrap](https://www.paypal.me/zTrap)\n\n## License\n\n       Copyright 2021 zTrap\n\n       Licensed under the Apache License, Version 2.0 (the \"License\");\n       you may not use this file except in compliance with the License.\n       You may obtain a copy of the License at\n\n           http://www.apache.org/licenses/LICENSE-2.0\n\n       Unless required by applicable law or agreed to in writing, software\n       distributed under the License is distributed on an \"AS IS\" BASIS,\n       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n       See the License for the specific language governing permissions and\n       limitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fztrap%2Fvalidate-mapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fztrap%2Fvalidate-mapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fztrap%2Fvalidate-mapper/lists"}