Files
shields/services/crates/crates-base.js
Sky 57aaaad7fe [crates] MSRV Badge (#9871)
Crates.io MSRV: `/crates/msrv/:crate`
Crates.io MSRV (version): `/crates/msrv/:crate/:version`
2024-01-07 20:54:27 +00:00

56 lines
1.5 KiB
JavaScript

import Joi from 'joi'
import { nonNegativeInteger } from '../validators.js'
import { BaseJsonService } from '../index.js'
const crateSchema = Joi.object({
crate: Joi.object({
downloads: nonNegativeInteger,
recent_downloads: nonNegativeInteger.allow(null),
max_version: Joi.string().required(),
}).required(),
versions: Joi.array()
.items(
Joi.object({
downloads: nonNegativeInteger,
license: Joi.string().required().allow(null),
rust_version: Joi.string().allow(null),
}),
)
.min(1)
.required(),
}).required()
const versionSchema = Joi.object({
version: Joi.object({
downloads: nonNegativeInteger,
num: Joi.string().required(),
license: Joi.string().required().allow(null),
rust_version: Joi.string().allow(null),
}).required(),
}).required()
const errorSchema = Joi.object({
errors: Joi.array()
.items(Joi.object({ detail: Joi.string().required() }))
.min(1)
.required(),
}).required()
const schema = Joi.alternatives(crateSchema, versionSchema, errorSchema)
class BaseCratesService extends BaseJsonService {
static defaultBadgeData = { label: 'crates.io' }
async fetch({ crate, version }) {
const url = version
? `https://crates.io/api/v1/crates/${crate}/${version}`
: `https://crates.io/api/v1/crates/${crate}?include=versions,downloads`
return this._requestJson({ schema, url })
}
}
const description =
'[Crates.io](https://crates.io/) is a package registry for Rust.'
export { BaseCratesService, description }