|
1 | 1 | import Joi from 'joi'
|
2 | 2 | import { nonNegativeInteger } from '../validators.js'
|
3 |
| -import { BaseJsonService } from '../index.js' |
| 3 | +import { BaseJsonService, InvalidParameter } from '../index.js' |
4 | 4 |
|
5 | 5 | const keywords = ['Rust']
|
6 | 6 |
|
@@ -47,6 +47,45 @@ class BaseCratesService extends BaseJsonService {
|
47 | 47 | : `https://crates.io/api/v1/crates/${crate}?include=versions,downloads`
|
48 | 48 | return this._requestJson({ schema, url })
|
49 | 49 | }
|
| 50 | + |
| 51 | + /** get the default version for a crate using the same logic as crates.io |
| 52 | + * this should be kept in sync with the crates.io implementation in |
| 53 | + * https://github.com/rust-lang/crates.io/blob/20bbac9f5521cb4888ef63f8464fddb28fd973f5/app/models/crate.js#L34-L41 |
| 54 | + * |
| 55 | + * @param {object} crate the `json.crate` response from crates.io |
| 56 | + * @returns {string} the default version string, or throws an error |
| 57 | + */ |
| 58 | + static defaultVersion(crate) { |
| 59 | + if (crate) { |
| 60 | + if (crate.max_stable_version) { |
| 61 | + return crate.max_stable_version |
| 62 | + } |
| 63 | + if (crate.max_version && crate.max_version !== '0.0.0') { |
| 64 | + return crate.max_version |
| 65 | + } |
| 66 | + } |
| 67 | + throw new InvalidParameter({ |
| 68 | + prettyMessage: |
| 69 | + 'default version not found, possibly all versions were yanked', |
| 70 | + }) |
| 71 | + } |
| 72 | + |
| 73 | + /** get the default version object from the `json.versions` array. |
| 74 | + * |
| 75 | + * @param {object} crate the `json.crate` response from crates.io |
| 76 | + * @param {object[]} versions the `json.versions` response from crates.io |
| 77 | + * @returns {object} the default version object, or throws an error if not found |
| 78 | + */ |
| 79 | + static defaultVersionObject(crate, versions) { |
| 80 | + const lastVerNum = BaseCratesService.defaultVersion(crate) |
| 81 | + const version = versions.find(ver => ver.num === lastVerNum) |
| 82 | + if (!version) { |
| 83 | + throw new InvalidParameter({ |
| 84 | + prettyMessage: 'version object not found in the versions array', |
| 85 | + }) |
| 86 | + } |
| 87 | + return version |
| 88 | + } |
50 | 89 | }
|
51 | 90 |
|
52 | 91 | export { BaseCratesService, keywords }
|
0 commit comments