{"id":349062,"name":"GBIF Name Parser","description":"The core GBIF scientific name parser library.","url":"https://github.com/gbif/name-parser","last_synced_at":"2026-08-10T17:15:48.847Z","repository":{"id":13510928,"uuid":"16201889","full_name":"gbif/name-parser","owner":"gbif","description":"The core GBIF scientific name parser library","archived":false,"fork":false,"pushed_at":"2026-07-14T15:10:40.000Z","size":3431,"stargazers_count":20,"open_issues_count":52,"forks_count":4,"subscribers_count":18,"default_branch":"master","last_synced_at":"2026-08-02T16:04:06.774Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","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/gbif.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":"2014-01-24T10:44:23.000Z","updated_at":"2026-07-14T15:08:44.000Z","dependencies_parsed_at":"2026-07-02T01:00:52.253Z","dependency_job_id":null,"html_url":"https://github.com/gbif/name-parser","commit_stats":null,"previous_names":[],"tags_count":76,"template":false,"template_full_name":null,"purl":"pkg:github/gbif/name-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gbif","download_url":"https://codeload.github.com/gbif/name-parser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36495131,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-10T02:00:05.122Z","response_time":58,"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"}},"owner":{"login":"gbif","name":"Global Biodiversity Information Facility","uuid":"1963797","kind":"organization","description":"","email":null,"website":"https://www.gbif.org","location":"Copenhagen, Denmark","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/1963797?v=4","repositories_count":288,"last_synced_at":"2024-04-14T06:45:04.085Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/gbif","funding_links":[],"total_stars":760,"followers":101,"following":0,"created_at":"2022-11-05T14:41:11.499Z","updated_at":"2024-04-14T06:46:12.959Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gbif","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gbif/repositories"},"packages":[],"commits":{"id":11691961,"full_name":"gbif/name-parser","default_branch":"master","total_commits":729,"total_committers":14,"total_bot_commits":2,"total_bot_committers":1,"mean_commits":52.07142857142857,"dds":0.24554183813443076,"past_year_total_commits":157,"past_year_total_committers":2,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":78.5,"past_year_dds":0.1146496815286624,"last_synced_at":"2026-08-05T17:04:23.700Z","last_synced_commit":"06e030399a6f8eeebfb0f3af74a3f202f6dc7b7b","created_at":"2026-03-23T01:01:37.089Z","updated_at":"2026-08-05T17:04:23.564Z","committers":[{"name":"Markus Döring","email":"mdoering@gbif.org","login":"mdoering","count":550},{"name":"gbif-jenkins","email":"dev@gbif.org","login":"gbif-jenkins","count":102},{"name":"gbif-jenkins","email":"jenkins@rancor.gbif.org","login":null,"count":30},{"name":"gbif-jenkins","email":"jenkins@jenkins-vh.gbif.org","login":null,"count":18},{"name":"pal155","email":"Doug.Palmer@csiro.au","login":"charvolant","count":8},{"name":"Federico Mendez","email":"fmendez@gbif.org","login":"fmendezh","count":7},{"name":"Oliver Meyn","email":"oliver@mineallmeyn.com","login":"omeyn","count":3},{"name":"Kyle Braak","email":"kbraak@gbif.org","login":null,"count":3},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":2},{"name":"Matthew Blissett","email":"mblissett@gbif.org","login":"MattBlissett","count":2},{"name":"Thomas Stjernegaard Jeppesen","email":"tsjeppesen@gbif.org","login":"thomasstjerne","count":1},{"name":"Nikolay Volik","email":"nvolik@gbif.org","login":"muttcg","count":1},{"name":"Christian Gendreau","email":"cgendreau","login":"cgendreau","count":1},{"name":"Jorrit Poelen","email":"jhpoelen@gmail.com","login":null,"count":1}],"past_year_committers":[{"name":"Markus Döring","email":"mdoering@gbif.org","login":"mdoering","count":139},{"name":"gbif-jenkins","email":"dev@gbif.org","login":"gbif-jenkins","count":18}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-10T00:00:10.517Z","repositories_count":6626395,"commits_count":918499963,"contributors_count":39007589,"owners_count":1330510,"committers_count":3291350,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"gbif/name-parser","html_url":"https://github.com/gbif/name-parser","last_synced_at":"2026-07-02T01:00:28.813Z","status":"error","issues_count":4,"pull_requests_count":3,"avg_time_to_close_issue":114712.66666666667,"avg_time_to_close_pull_request":57980611.0,"issues_closed_count":3,"pull_requests_closed_count":2,"pull_request_authors_count":2,"issue_authors_count":3,"avg_comments_per_issue":1.25,"avg_comments_per_pull_request":0.3333333333333333,"merged_pull_requests_count":0,"bot_issues_count":0,"bot_pull_requests_count":3,"past_year_issues_count":3,"past_year_pull_requests_count":1,"past_year_avg_time_to_close_issue":169850.5,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":1.3333333333333333,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":1,"past_year_merged_pull_requests_count":0,"created_at":"2025-08-29T18:55:33.165Z","updated_at":"2026-07-02T01:00:28.813Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbif%2Fname-parser/issues","issue_labels_count":{"bug":1},"pull_request_labels_count":{"dependencies":2,"java":1},"issue_author_associations_count":{"NONE":3,"MEMBER":1},"pull_request_author_associations_count":{"CONTRIBUTOR":2,"NONE":1},"issue_authors":{"djtfmartin":2,"CecSve":1,"mdoering":1},"pull_request_authors":{"dependabot[bot]":2,"renovate[bot]":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-10T00:00:23.081Z","repositories_count":14794899,"issues_count":28404205,"pull_requests_count":93762680,"authors_count":11429768,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"bug":1},"past_year_pull_request_labels_count":{"dependencies":1,"java":1},"past_year_issue_author_associations_count":{"MEMBER":1,"NONE":1},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":1},"past_year_issue_authors":{"djtfmartin":1,"mdoering":1},"past_year_pull_request_authors":{"dependabot[bot]":1},"maintainers":[{"login":"mdoering","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mdoering"}],"active_maintainers":[{"login":"mdoering","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mdoering"}]},"events":{"total":{"DeleteEvent":3,"PullRequestEvent":1,"ForkEvent":1,"IssuesEvent":2,"WatchEvent":1,"IssueCommentEvent":4,"PushEvent":71,"CreateEvent":6},"last_year":{"DeleteEvent":1,"PullRequestEvent":1,"IssuesEvent":1,"WatchEvent":1,"IssueCommentEvent":2,"PushEvent":52,"CreateEvent":3}},"keywords":[],"dependencies":[{"ecosystem":"maven","filepath":"name-parser/pom.xml","sha":null,"kind":"manifest","created_at":"2022-09-05T02:42:14.134Z","updated_at":"2022-09-05T02:42:14.134Z","repository_link":"https://github.com/gbif/name-parser/blob/master/name-parser/pom.xml","dependencies":[{"id":3858246688,"package_name":"org.gbif:name-parser-api","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246689,"package_name":"org.slf4j:slf4j-api","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246690,"package_name":"commons-io:commons-io","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246691,"package_name":"org.apache.commons:commons-lang3","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246692,"package_name":"com.google.guava:guava","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246693,"package_name":"org.gbif:name-parser-api","ecosystem":"maven","requirements":null,"direct":true,"kind":"test","optional":false},{"id":3858246694,"package_name":"junit:junit","ecosystem":"maven","requirements":null,"direct":true,"kind":"test","optional":false},{"id":3858246695,"package_name":"ch.qos.logback:logback-classic","ecosystem":"maven","requirements":null,"direct":true,"kind":"test","optional":false}]},{"ecosystem":"maven","filepath":"name-parser-api/pom.xml","sha":null,"kind":"manifest","created_at":"2022-09-05T02:42:14.292Z","updated_at":"2022-09-05T02:42:14.292Z","repository_link":"https://github.com/gbif/name-parser/blob/master/name-parser-api/pom.xml","dependencies":[{"id":3858246799,"package_name":"com.google.code.findbugs:jsr305","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246800,"package_name":"com.google.guava:guava","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246801,"package_name":"org.apache.commons:commons-lang3","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246802,"package_name":"org.slf4j:slf4j-api","ecosystem":"maven","requirements":null,"direct":true,"kind":"runtime","optional":false},{"id":3858246803,"package_name":"junit:junit","ecosystem":"maven","requirements":null,"direct":true,"kind":"test","optional":false},{"id":3858246804,"package_name":"commons-io:commons-io","ecosystem":"maven","requirements":null,"direct":true,"kind":"test","optional":false},{"id":3858246805,"package_name":"ch.qos.logback:logback-classic","ecosystem":"maven","requirements":null,"direct":true,"kind":"test","optional":false}]},{"ecosystem":"maven","filepath":"pom.xml","sha":null,"kind":"manifest","created_at":"2022-09-05T02:42:14.530Z","updated_at":"2022-09-05T02:42:14.530Z","repository_link":"https://github.com/gbif/name-parser/blob/master/pom.xml","dependencies":[{"id":3858248593,"package_name":"com.google.code.findbugs:jsr305","ecosystem":"maven","requirements":"3.0.2","direct":true,"kind":"runtime","optional":false},{"id":3858248594,"package_name":"org.gbif:name-parser","ecosystem":"maven","requirements":"3.7.3-SNAPSHOT","direct":true,"kind":"runtime","optional":false},{"id":3858248595,"package_name":"org.gbif:name-parser-api","ecosystem":"maven","requirements":"3.7.3-SNAPSHOT","direct":true,"kind":"runtime","optional":false},{"id":3858248596,"package_name":"org.gbif:name-parser-gbif","ecosystem":"maven","requirements":"3.7.3-SNAPSHOT","direct":true,"kind":"runtime","optional":false},{"id":3858248597,"package_name":"org.gbif:gbif-api","ecosystem":"maven","requirements":"0.166","direct":true,"kind":"runtime","optional":false},{"id":3858248598,"package_name":"org.slf4j:slf4j-api","ecosystem":"maven","requirements":"1.7.24","direct":true,"kind":"runtime","optional":false},{"id":3858248599,"package_name":"commons-io:commons-io","ecosystem":"maven","requirements":"2.8.0","direct":true,"kind":"runtime","optional":false},{"id":3858248600,"package_name":"org.apache.commons:commons-lang3","ecosystem":"maven","requirements":"3.12.0","direct":true,"kind":"runtime","optional":false},{"id":3858248601,"package_name":"com.google.guava:guava","ecosystem":"maven","requirements":"28.0-jre","direct":true,"kind":"runtime","optional":false},{"id":3858248602,"package_name":"org.gbif:name-parser-api","ecosystem":"maven","requirements":"3.7.3-SNAPSHOT","direct":true,"kind":"test","optional":false},{"id":3858248603,"package_name":"junit:junit","ecosystem":"maven","requirements":"4.12","direct":true,"kind":"test","optional":false},{"id":3858248604,"package_name":"ch.qos.logback:logback-classic","ecosystem":"maven","requirements":"1.2.3","direct":true,"kind":"test","optional":false}]},{"ecosystem":"maven","filepath":"name-parser-cli/pom.xml","sha":null,"kind":"manifest","created_at":"2026-07-02T01:00:50.215Z","updated_at":"2026-07-02T01:00:50.215Z","repository_link":"https://github.com/gbif/name-parser/blob/master/name-parser-cli/pom.xml","dependencies":[{"id":25878581319,"package_name":"org.gbif:name-parser","ecosystem":"maven","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25878581330,"package_name":"com.google.code.gson:gson","ecosystem":"maven","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25878581363,"package_name":"org.catalogueoflife:coldp","ecosystem":"maven","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25878581376,"package_name":"org.slf4j:slf4j-api","ecosystem":"maven","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25878581380,"package_name":"ch.qos.logback:logback-classic","ecosystem":"maven","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25878581381,"package_name":"junit:junit","ecosystem":"maven","requirements":"*","direct":true,"kind":"test","optional":false}]}],"score":6.915723448631313,"created_at":"2026-03-21T00:13:30.378Z","updated_at":"2026-08-10T17:15:48.849Z","avatar_url":"https://github.com/gbif.png","language":"Java","category":"Biosphere","sub_category":"Biodiversity Data Cleaning and Standardization","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# GBIF Name Parser API\n\nThe data model and parser contract for scientific names — `ParsedName`,\n`Authorship`, `Rank`, `NomCode`, `NameType`, the `NameParser` interface and the\n`ParseResult` it returns — plus name formatting and rank/unicode utilities.\n\nAs of **5.0.0 this repository is API-only**: it ships the single\n`name-parser-api` artifact. The parsing engine has been reimplemented in Rust\n(with the full regression corpus), and is consumed through this interface via a\nnative binding. The previous Java implementation (`NameParserImpl` and the\n`name-parser` / `name-parser-cli` modules) lives on the **`4.x` branch** for\nmaintenance; see [Migrating from 4.x to 5.0](#migrating-from-4x-to-50).\n\n## What's in here\n\n| Type | Purpose |\n|---|---|\n| `ParsedName`, `ParsedAuthorship`, `Authorship` | the structured name / authorship model |\n| `Rank`, `NomCode`, `NameType`, `NamePart` | the controlled vocabularies |\n| `NameParser` | the parser contract — returns a `ParseResult` |\n| `ParseResult` (`Parsed` \\| `Informal` \\| `Unparsable`) | the three-way parse outcome; see below |\n| `UnparsableNameException` | unchecked; raised only by `ParseResult.orElseThrow()` |\n| `NameFormatter` | render a `ParsedName`, an `Informal`, or a whole `ParseResult` (also any `CombinedAuthorshipIF`) back to a string |\n| `RankUtils`, `UnicodeUtils` | rank relationships and unicode/homoglyph helpers |\n\n## Library use\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003eorg.gbif\u003c/groupId\u003e\n  \u003cartifactId\u003ename-parser-api\u003c/artifactId\u003e\n  \u003cversion\u003e5.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n`parse(...)` never throws — it returns a sealed, **three-way** `ParseResult`:\n\n* **`Parsed`** — a fully structured `ParsedName` (its `state()` may be `COMPLETE` or `PARTIAL`).\n* **`Informal`** — a semistructured name: a real supraspecific `taxon` carrying a provisional,\n  non-code designation instead of a determined species epithet — a molecular provisional species\n  (`Rhizobium sp. RMCC TR1811`), a numbered placeholder (`Allium sp. 1`), or an informal group\n  (`Bartonella group`). It is a flat `taxon` / `taxonRank` / `rank` / `phrase` / `code` and carries\n  **no** `ParsedName` — the anchor is unvalidated, so it is never mislabelled as a determined genus.\n  Names that keep a species epithet — including cf./aff. and infraspecific-indeterminate ones —\n  stay `Parsed`, so their `specificAuthorship` (which a flat anchor could not hold) survives.\n* **`Unparsable`** — not a scientific name at all: a virus, a hybrid formula, a placeholder, or a\n  machine identifier such as a BOLD BIN / UNITE SH / OTU / culture-collection accession. `type()`\n  classifies it — `FORMULA`, `PLACEHOLDER`, `IDENTIFIER`, or `OTHER`.\n\n`type()` and `code()` are available on all three variants, so you can classify without catching\nanything:\n\n```java\nNameParser parser = new NameParserRust(); // the native (Rust-backed) implementation — see below\n\nswitch (parser.parse(\"Rhizobium sp. RMCC TR1811\", null, null, null)) {\n  case ParseResult.Parsed p     -\u003e index(p.name());                     // a full ParsedName\n  case ParseResult.Informal i   -\u003e indexInformal(i.taxon(), i.phrase()); // \"Rhizobium\" + \"RMCC TR1811\"\n  case ParseResult.Unparsable u -\u003e record(u.type(), u.code());          // type FORMULA/PLACEHOLDER/IDENTIFIER/OTHER, code e.g. VIRUS\n}\n```\n\nAny variant round-trips back to a string via `NameFormatter.canonical(result)` — the reconstructed\nname for `Parsed`, the informal name (`Rhizobium sp. RMCC TR1811`) for `Informal`, the verbatim\ninput for `Unparsable` — or call `NameFormatter.canonical(informal)` on an `Informal` directly.\n\nIt composes in streams:\n\n```java\nList\u003cParsedName\u003e parsed = names.stream()\n    .map(n -\u003e parser.parse(n, null, rank, code))\n    .flatMap(r -\u003e r.parsed().stream()) // keeps only Parsed; Informal + Unparsable have an empty parsed()\n    .toList();\n```\n\n…and offers an opt-in fail-fast path for callers that want it:\n\n```java\nParsedName pn = parser.parse(name).orElseThrow(); // throws unchecked UnparsableNameException\n```\n\nOnly need the model or the formatter (no parsing)? Depend on this artifact and\nuse `ParsedName` / `NameFormatter` directly — no implementation required.\n\n## The parsing engine (Rust)\n\nFrom 5.0 the reference implementation lives in a separate project,\n[**gbif/name-parser-rust**](https://github.com/gbif/name-parser-rust). The\nparser core is a Rust crate (`nameparser`), which also carries the full\nregression corpus ported from the old Java suite, and is exposed through several\nbindings — a C-ABI cdylib (`nameparser-ffi`) and a Python module\n(`nameparser-py`).\n\nJava callers get a `NameParser` from that project's Panama binding:\n`org.gbif.nameparser.rust.NameParserRust` implements\n`org.gbif.nameparser.api.NameParser` from *this* module by downcalling the Rust\ncdylib in-process via `java.lang.foreign` (FFM/Panama, stable since JDK 22 — no\n`--enable-preview`). Each `parse` marshals across the FFI boundary and rebuilds\na `ParsedName` from a flat binary struct. Because `java.lang.foreign` needs a\nmodern JDK, that binding targets **JDK 25+** and is\nbuilt and released independently of this Java-17 API module — which is exactly\nwhy the API stays on 17: model- and formatter-only consumers keep the broad\nbaseline, while only the native binding requires the newer JDK.\n\n### Depending on the Rust binding (to actually parse)\n\nThis api artifact carries **no parser** on its own. For a working `NameParser`, add the native\nbinding — `org.gbif.nameparser:name-parser-rust`, from\n[**gbif/name-parser-rust**](https://github.com/gbif/name-parser-rust) — which pulls this\n`name-parser-api` in transitively. It ships as a thin main JAR plus one native classifier JAR per\nplatform (netty-tcnative style), so you download only your own architecture's cdylib. Requires\n**JDK 25+**.\n\n```xml\n\u003cbuild\u003e\u003cextensions\u003e\n  \u003c!-- resolves ${os.detected.classifier}: linux-x86_64, osx-aarch_64, windows-x86_64, … --\u003e\n  \u003cextension\u003e\n    \u003cgroupId\u003ekr.motd.maven\u003c/groupId\u003e\n    \u003cartifactId\u003eos-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e1.7.1\u003c/version\u003e\n  \u003c/extension\u003e\n\u003c/extensions\u003e\u003c/build\u003e\n\n\u003cdependencies\u003e\n  \u003cdependency\u003e                    \u003c!-- thin main JAR: Java + FFM loader (brings name-parser-api) --\u003e\n    \u003cgroupId\u003eorg.gbif.nameparser\u003c/groupId\u003e\n    \u003cartifactId\u003ename-parser-rust\u003c/artifactId\u003e\n    \u003cversion\u003e0.1.0-SNAPSHOT\u003c/version\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e                    \u003c!-- your platform's native cdylib --\u003e\n    \u003cgroupId\u003eorg.gbif.nameparser\u003c/groupId\u003e\n    \u003cartifactId\u003ename-parser-rust\u003c/artifactId\u003e\n    \u003cversion\u003e0.1.0-SNAPSHOT\u003c/version\u003e\n    \u003cclassifier\u003e${os.detected.classifier}\u003c/classifier\u003e\n  \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\nThe binding is published to GBIF's Nexus; if your build doesn't already resolve from it, add:\n\n```xml\n\u003crepositories\u003e\n  \u003crepository\u003e\n    \u003cid\u003egbif-all\u003c/id\u003e\n    \u003curl\u003ehttps://repository.gbif.org/content/groups/gbif\u003c/url\u003e\n  \u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\n`0.1.0-SNAPSHOT` is auto-deployed on every push to `main` (a released `0.1.0` will follow); the\nbinding tracks the Rust engine's own version line, independent of this api's `5.0.0`. Then just\nconstruct it — no other wiring, and the same `NameParser` interface as before:\n\n```java\nNameParser parser = new org.gbif.nameparser.rust.NameParserRust();\n```\n\n## Migrating from 4.x to 5.0\n\n5.0 keeps the same model but changes the parser contract and drops the bundled\nJava engine.\n\n* **`parse(...)` returns a three-way `ParseResult`, not `ParsedName`, and no longer throws.**\n  Replace `try { ParsedName pn = parser.parse(…); } catch (UnparsableNameException e) { … }`\n  with a `switch` over `Parsed | Informal | Unparsable`, or `parser.parse(…).parsed()` /\n  `.orElseThrow()`. `type()` and `code()` are on all three variants, so failure\n  classification no longer needs the exception.\n* **Informal / semistructured names are now their own `Informal` result, not a `ParsedName`.**\n  Names that 4.x returned as a `ParsedName` with `type = INFORMAL` and no species epithet — a\n  supraspecific taxon plus a provisional designation (`Genus sp. \u003ctag\u003e`, `Bartonella group`) — now\n  come back as a flat `ParseResult.Informal` (`taxon` / `taxonRank` / `rank` / `phrase` / `code`)\n  that carries no `ParsedName`. A `switch` that previously handled only `Parsed` and `Unparsable`\n  must add the `Informal` arm. (Names that keep a species epithet — cf./aff., strain, infraspecific\n  indet — stay `Parsed` as before.)\n* **`parseAuthorship(...)` returns `Optional\u003cParsedAuthorship\u003e`** instead of\n  throwing.\n* **`UnparsableNameException` is now unchecked** (`extends RuntimeException`) and\n  is only raised by `ParseResult.orElseThrow()`.\n* **The Java parser is gone from this repo.** `new NameParserImpl()` no longer\n  exists in 5.0 — obtain a `NameParser` from the native binding instead. If you\n  need the pure-Java engine, stay on the **`4.x` branch** (`name-parser` 4.2.x),\n  which keeps the old throwing API and `NameParserImpl`.\n\nModel/vocabulary changes introduced across the 4.x line (still current in 5.0)\nare documented in the `4.x` branch README — notably `NameType.VIRUS`/`OTU`\nremoval (viruses now carry `code = VIRUS`), `Rank.DIVISION` → `DIVISION_ZOOLOGY`\nplus a new `DIVISION_BOTANY`, imprint years moving to `Authorship`, and the\n`CombinedAuthorshipIF` / `publishedInYear` / generic-\u0026-specific-authorship\nadditions.\n\n## Build\n\n`mvn install` from the repo root — a single-module Java 17 build.\n\n## License\n\nApache 2.0.\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["biodiversity-informatics","darwin-core","taxonomy","gbif","tdwg","biodiversity","species","snapshot","interest-group"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/349062","html_url":"https://ost.ecosyste.ms/projects/349062"}