plugin-api
Canonical league data schema and WIT plugin interface shared by the FullTime plugin host (Apps/rust) and data-provider plugins (Plugins/Bundesliga, and future league plugins).
Neither the host nor any plugin owns this contract - it is versioned and published independently so plugins and the host can evolve without a lockstep release.
What's in this crate
- Canonical
league-data-schema(Competition,Team,Fixture,Standings, ...): the source-agnostic data shape every plugin maps its provider's response into, and every host UI consumes. Covers single-table league formats and group-based tournament formats with the same types. data-providerWIT interface (wit/data-provider.wit): the contract a plugin implements -list-competitions,fetch-fixtures,fetch-results,fetch-standings,fetch-metadata- plus structured error variants for network failure, rate limiting, and schema-mapping failure. Rust bindings are generated from this file viawit-bindgen, not hand-written, so the WIT source is the single source of truth.- Plugin manifest format (
Manifest): the static TOML file every plugin ships declaring its ID, release version, targeted schema/interface versions, and required network hosts. This crate validates structure and field format only - network reachability and capability enforcement belong to the host runtime (Apps/rust). hostinterface andGuest/export!bindings:world pluginimportshost.fetch- a plugin has no direct network access and must call this crate'shost_fetchwrapper for every upstream request. This crate also re-exports the generatedGuesttrait andexport!macro so a downstream plugin implements and exports the world using this crate's own canonical types, rather than regenerating an incompatible copy from a vendored WIT file.
Versioning
The schema and the interface each carry an independent major.minor [Version] identifier (SCHEMA_VERSION, INTERFACE_VERSION), because a schema field addition and an interface function signature change are unrelated concerns and shouldn't force a shared breaking version.
Compatibility is major-version equality, minor-version-or-lower on the plugin side: a plugin declaring 1.2 loads against a host on 1.3+ (the host is a superset) but not 1.1 (missing fields) or 2.x (major mismatch).
See [Version::accepts].
Usage
[]
= "0.1"
use ;
let manifest = parse?;
assert!;
# Ok::
Building a plugin
See docs/plugin-authoring.md for a walkthrough of the WIT interface, manifest format, and versioning policy.
Change log
Contributing
See CONTRIBUTING.md for the development workflow and commit conventions, and RELEASING.md for how versions get cut. This project follows the Code of Conduct.
Security
See SECURITY.md to report a vulnerability.
License
Licensed under:
- MIT license (LICENSE.md or https://opensource.org/licenses/MIT)
Contribution
Unless explicitly stated otherwise, any contribution intentionally submitted for inclusion in the work by you shall be licensed as above.