Compare commits
35 commits
Author | SHA1 | Date | |
---|---|---|---|
asonix | 4717e4fdb2 | ||
asonix | 73002d4d35 | ||
asonix | a335225088 | ||
asonix | 0d9ec4cc87 | ||
asonix | 21ffc4111e | ||
asonix | a2abc146f4 | ||
asonix | 7b188e2fa1 | ||
asonix | 801747c7bc | ||
asonix | 39e2344fb2 | ||
asonix | d163a3cf79 | ||
asonix | c834b6c913 | ||
asonix | 74b011afe9 | ||
asonix | 4ccba45d58 | ||
asonix | 5db1dbc96c | ||
asonix | 2d5da08bad | ||
asonix | 17177cb6ea | ||
asonix | 26df437691 | ||
asonix | 64ea25c915 | ||
asonix | 203ffbbbaf | ||
asonix | 88aa177f7c | ||
asonix | afe081a099 | ||
asonix | 5b02cbec16 | ||
asonix | faec338d57 | ||
asonix | 909ce8af4c | ||
asonix | 58b48871b1 | ||
asonix | 50d41873cd | ||
asonix | e9510092c5 | ||
asonix | 78e4d834ed | ||
asonix | 71cb19ff83 | ||
asonix | 8a0e026fc5 | ||
asonix | 103a320898 | ||
asonix | 1a42a82e91 | ||
asonix | 047b5c27ee | ||
asonix | de0dd9580c | ||
asonix | 6a84b7cb7e |
61
.forgejo/workflows/check.yaml
Normal file
61
.forgejo/workflows/check.yaml
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
clippy:
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout warriors-names
|
||||||
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Cargo Cache
|
||||||
|
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||||
|
-
|
||||||
|
name: Clippy
|
||||||
|
run: |
|
||||||
|
cargo clippy --no-default-features -- -D warnings
|
||||||
|
|
||||||
|
tests:
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout warriors-names
|
||||||
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Cargo Cache
|
||||||
|
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||||
|
-
|
||||||
|
name: Test
|
||||||
|
run: cargo test
|
||||||
|
|
||||||
|
check:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
target:
|
||||||
|
- x86_64-unknown-linux-musl
|
||||||
|
- armv7-unknown-linux-musleabihf
|
||||||
|
- aarch64-unknown-linux-musl
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout warriors-names
|
||||||
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Cargo Cache
|
||||||
|
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||||
|
-
|
||||||
|
name: Debug builds
|
||||||
|
run: cargo zigbuild --target ${{ matrix.target }}
|
225
.forgejo/workflows/publish.yaml
Normal file
225
.forgejo/workflows/publish.yaml
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*.*.*'
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY_IMAGE: asonix/warriors-names
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
clippy:
|
||||||
|
runs-on: base-image
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout warriors-names
|
||||||
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Cargo Cache
|
||||||
|
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||||
|
-
|
||||||
|
name: Clippy
|
||||||
|
run: |
|
||||||
|
cargo clippy --no-default-features -- -D warnings
|
||||||
|
|
||||||
|
tests:
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout warriors-names
|
||||||
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Cargo Cache
|
||||||
|
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||||
|
-
|
||||||
|
name: Test
|
||||||
|
run: cargo test
|
||||||
|
|
||||||
|
build:
|
||||||
|
needs:
|
||||||
|
- clippy
|
||||||
|
- tests
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
info:
|
||||||
|
- target: x86_64-unknown-linux-musl
|
||||||
|
artifact: linux-amd64
|
||||||
|
platform: linux/amd64
|
||||||
|
- target: armv7-unknown-linux-musleabihf
|
||||||
|
artifact: linux-arm32v7
|
||||||
|
platform: linux/arm/v7
|
||||||
|
- target: aarch64-unknown-linux-musl
|
||||||
|
artifact: linux-arm64v8
|
||||||
|
platform: linux/arm64
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout warriors-names
|
||||||
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Cargo Cache
|
||||||
|
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||||
|
-
|
||||||
|
name: Prepare Platform
|
||||||
|
run: |
|
||||||
|
platform=${{ matrix.info.platform }}
|
||||||
|
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
-
|
||||||
|
name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: https://github.com/docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY_IMAGE }}
|
||||||
|
flavor: |
|
||||||
|
latest=auto
|
||||||
|
suffix=-${{ matrix.info.artifact }}
|
||||||
|
tags: |
|
||||||
|
type=raw,value=latest,enable={{ is_default_branch }}
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: https://github.com/docker/setup-qemu-action@v3
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: https://github.com/docker/setup-buildx-action@v3
|
||||||
|
-
|
||||||
|
name: Docker login
|
||||||
|
uses: https://github.com/docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Compile warriors-names
|
||||||
|
run: cargo zigbuild --target ${{ matrix.info.target }} --release
|
||||||
|
-
|
||||||
|
name: Prepare artifacts
|
||||||
|
run: |
|
||||||
|
mkdir artifacts
|
||||||
|
cp target/${{ matrix.info.target }}/release/warriors-names artifacts/warriors-names-${{ matrix.info.artifact }}
|
||||||
|
-
|
||||||
|
uses: https://github.com/actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: binaries
|
||||||
|
path: artifacts/
|
||||||
|
-
|
||||||
|
name: Prepare binary
|
||||||
|
run: |
|
||||||
|
cp target/${{ matrix.info.target }}/release/warriors-names docker/forgejo/warriors-names
|
||||||
|
-
|
||||||
|
name: Build and push ${{ matrix.info.platform }} docker image
|
||||||
|
id: build
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: ./docker/forgejo
|
||||||
|
platforms: ${{ matrix.info.platform }}
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},name-canonical=true,push=true
|
||||||
|
-
|
||||||
|
name: Export digest
|
||||||
|
run: |
|
||||||
|
mkdir -p /tmp/digests
|
||||||
|
digest="${{ steps.build.outputs.digest }}"
|
||||||
|
touch "/tmp/digests/${digest#sha256:}"
|
||||||
|
echo "Created /tmp/digests/${digest#sha256:}"
|
||||||
|
shell: bash
|
||||||
|
-
|
||||||
|
name: Upload ${{ matrix.info.platform }} digest
|
||||||
|
uses: https://github.com/actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: digests
|
||||||
|
path: /tmp/digests/*
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
publish-docker:
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
needs: [build]
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Download digests
|
||||||
|
uses: https://github.com/actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: digests
|
||||||
|
path: /tmp/digests
|
||||||
|
pattern: digests-*
|
||||||
|
merge-multiple: true
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
-
|
||||||
|
name: Docker login
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: https://github.com/docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY_IMAGE }}
|
||||||
|
flavor: |
|
||||||
|
latest=auto
|
||||||
|
tags: |
|
||||||
|
type=raw,value=latest,enable={{ is_default_branch }}
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
-
|
||||||
|
name: Create manifest list and push
|
||||||
|
working-directory: /tmp/digests
|
||||||
|
run: |
|
||||||
|
tags=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "${DOCKER_METADATA_OUTPUT_JSON}")
|
||||||
|
images=$(printf "${{ env.REGISTRY_IMAGE }}@sha256:%s " *)
|
||||||
|
echo "Running 'docker buildx imagetools create ${tags[@]} ${images[@]}'"
|
||||||
|
docker buildx imagetools create ${tags[@]} ${images[@]}
|
||||||
|
shell: bash
|
||||||
|
-
|
||||||
|
name: Inspect Image
|
||||||
|
run: |
|
||||||
|
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
|
||||||
|
|
||||||
|
publish-forgejo:
|
||||||
|
needs: [build]
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
steps:
|
||||||
|
- uses: https://github.com/actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: binaries
|
||||||
|
path: artifacts/
|
||||||
|
merge-multiple: true
|
||||||
|
- uses: actions/forgejo-release@v1
|
||||||
|
with:
|
||||||
|
direction: upload
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
release-dir: artifacts/
|
||||||
|
|
||||||
|
publish-crate:
|
||||||
|
needs: [build]
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: docker.io/asonix/actions-base-image:0.1
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout warriors-names
|
||||||
|
uses: https://github.com/actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Cargo Cache
|
||||||
|
uses: https://git.asonix.dog/asonix/actions/cache-rust-dependencies@main
|
||||||
|
-
|
||||||
|
name: Publish Crate
|
||||||
|
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,3 +1,6 @@
|
||||||
/target
|
/target
|
||||||
Token.toml
|
Token.toml
|
||||||
Config.toml
|
Config.toml
|
||||||
|
.envrc
|
||||||
|
.direnv
|
||||||
|
result
|
||||||
|
|
1016
Cargo.lock
generated
1016
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
22
Cargo.toml
22
Cargo.toml
|
@ -1,17 +1,25 @@
|
||||||
[package]
|
[package]
|
||||||
name = "warriors-names"
|
name = "warriors-names"
|
||||||
version = "0.1.1"
|
description = "A bot that generates warriors cat names and posts them to mastodon"
|
||||||
|
version = "0.2.3"
|
||||||
authors = ["asonix <asonix@asonix.dog>"]
|
authors = ["asonix <asonix@asonix.dog>"]
|
||||||
edition = "2018"
|
license = "AGPL-3.0"
|
||||||
|
repository = "https://git.asonix.dog/asonix/warriors-names"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
[profile.release]
|
||||||
|
strip = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
rand = "0.7"
|
rand = "0.8"
|
||||||
reqwest = { version = "0.10", default-features = false, features = ["json", "rustls-tls"] }
|
reqwest = { version = "0.11", default-features = false, features = [
|
||||||
|
"json",
|
||||||
|
"rustls-tls",
|
||||||
|
] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
toml = "0.5"
|
serde_json = "1.0"
|
||||||
tokio = { version = "0.3", features = ["full"] }
|
toml = "0.8"
|
||||||
tokio-compat-02 = "0.1"
|
tokio = { version = "1", features = ["full"] }
|
||||||
url = { version = "2.0", features = ["serde"] }
|
url = { version = "2.0", features = ["serde"] }
|
||||||
|
|
|
@ -1,131 +1,3 @@
|
||||||
[names]
|
|
||||||
prefix = [
|
|
||||||
"feather",
|
|
||||||
"crow",
|
|
||||||
"bramble",
|
|
||||||
"hawk",
|
|
||||||
"fire",
|
|
||||||
"red",
|
|
||||||
"lion",
|
|
||||||
"misty",
|
|
||||||
"tawny",
|
|
||||||
"gray",
|
|
||||||
"running",
|
|
||||||
"golden",
|
|
||||||
"owl",
|
|
||||||
"rabbit",
|
|
||||||
"spider",
|
|
||||||
"leaf",
|
|
||||||
"squirrel",
|
|
||||||
"oak",
|
|
||||||
"storm",
|
|
||||||
"stone",
|
|
||||||
"sand",
|
|
||||||
"dark",
|
|
||||||
"long",
|
|
||||||
"one",
|
|
||||||
"half",
|
|
||||||
"holly",
|
|
||||||
"black",
|
|
||||||
"brindle",
|
|
||||||
"leopard",
|
|
||||||
"tiger",
|
|
||||||
"moth",
|
|
||||||
"spotted",
|
|
||||||
"raven",
|
|
||||||
"sorrel",
|
|
||||||
"cloud",
|
|
||||||
"bright",
|
|
||||||
"lost",
|
|
||||||
"cedar",
|
|
||||||
"ginger",
|
|
||||||
"blue",
|
|
||||||
"white",
|
|
||||||
"willow",
|
|
||||||
"mouse",
|
|
||||||
"dust",
|
|
||||||
"frost",
|
|
||||||
"speckle",
|
|
||||||
"small",
|
|
||||||
"patch",
|
|
||||||
"dapple",
|
|
||||||
"broken",
|
|
||||||
"stumpy",
|
|
||||||
"brown",
|
|
||||||
"wet",
|
|
||||||
"claw",
|
|
||||||
"little",
|
|
||||||
"night",
|
|
||||||
"dawn",
|
|
||||||
"ash",
|
|
||||||
"tall",
|
|
||||||
"crooked",
|
|
||||||
"yellow",
|
|
||||||
"cinder",
|
|
||||||
"bracken",
|
|
||||||
"dead",
|
|
||||||
"bark",
|
|
||||||
"torn",
|
|
||||||
"morning",
|
|
||||||
"mud",
|
|
||||||
"shade",
|
|
||||||
"loud",
|
|
||||||
"silver",
|
|
||||||
"swift",
|
|
||||||
"thorn",
|
|
||||||
"heavy",
|
|
||||||
"fern",
|
|
||||||
"rowan",
|
|
||||||
"gorse",
|
|
||||||
"moss",
|
|
||||||
"russet",
|
|
||||||
"jagged",
|
|
||||||
"rain",
|
|
||||||
"soot",
|
|
||||||
"shrew",
|
|
||||||
"talon",
|
|
||||||
"weasel",
|
|
||||||
"robin",
|
|
||||||
"thistle",
|
|
||||||
"vole",
|
|
||||||
"swallow",
|
|
||||||
"splash",
|
|
||||||
"smoke",
|
|
||||||
]
|
|
||||||
suffix = [
|
|
||||||
"kit",
|
|
||||||
"paw",
|
|
||||||
"star",
|
|
||||||
"leaf",
|
|
||||||
"tail",
|
|
||||||
"heart",
|
|
||||||
"claw",
|
|
||||||
"storm",
|
|
||||||
"stripe",
|
|
||||||
"wind",
|
|
||||||
"pelt",
|
|
||||||
"fur",
|
|
||||||
"face",
|
|
||||||
"flower",
|
|
||||||
"ear",
|
|
||||||
"eye",
|
|
||||||
"foot",
|
|
||||||
"nose",
|
|
||||||
"cloud",
|
|
||||||
"fang",
|
|
||||||
"poppy",
|
|
||||||
"whisker",
|
|
||||||
"belly",
|
|
||||||
"stream",
|
|
||||||
"pool",
|
|
||||||
"throat",
|
|
||||||
"brook",
|
|
||||||
"tooth",
|
|
||||||
"step",
|
|
||||||
"frost",
|
|
||||||
"wing",
|
|
||||||
]
|
|
||||||
|
|
||||||
[timing]
|
[timing]
|
||||||
duration = 360
|
duration = 360
|
||||||
|
|
||||||
|
|
336
Description.json
Normal file
336
Description.json
Normal file
|
@ -0,0 +1,336 @@
|
||||||
|
{
|
||||||
|
"root": "pelt",
|
||||||
|
"entries": [{
|
||||||
|
"name": "descriptor",
|
||||||
|
"variants": [
|
||||||
|
"sleek",
|
||||||
|
"large",
|
||||||
|
"small",
|
||||||
|
"swift",
|
||||||
|
"skinny",
|
||||||
|
"thin",
|
||||||
|
"young",
|
||||||
|
"old",
|
||||||
|
"long-legged",
|
||||||
|
"long-haired",
|
||||||
|
"long-tailed",
|
||||||
|
"huge",
|
||||||
|
"massive",
|
||||||
|
"battle-scarred",
|
||||||
|
"pretty",
|
||||||
|
"handsome",
|
||||||
|
"beautiful",
|
||||||
|
"mottled"
|
||||||
|
],
|
||||||
|
"next": [{
|
||||||
|
"from": [
|
||||||
|
"massive",
|
||||||
|
"huge",
|
||||||
|
"large"
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
"long-legged",
|
||||||
|
"long-haired",
|
||||||
|
"old",
|
||||||
|
"young",
|
||||||
|
"long-tailed",
|
||||||
|
"battle-scarred",
|
||||||
|
"handsome",
|
||||||
|
"pretty",
|
||||||
|
"beautiful",
|
||||||
|
"mottled"
|
||||||
|
],
|
||||||
|
"chance": 0.5,
|
||||||
|
"join": ", "
|
||||||
|
}, {
|
||||||
|
"from": ["small"],
|
||||||
|
"to": [
|
||||||
|
"sleek",
|
||||||
|
"swift",
|
||||||
|
"skinny",
|
||||||
|
"thin",
|
||||||
|
"old",
|
||||||
|
"young",
|
||||||
|
"long-haired",
|
||||||
|
"battle-scarred",
|
||||||
|
"handsome",
|
||||||
|
"pretty",
|
||||||
|
"beautiful",
|
||||||
|
"mottled"
|
||||||
|
],
|
||||||
|
"chance": 0.5,
|
||||||
|
"join": ", "
|
||||||
|
}, {
|
||||||
|
"from": [
|
||||||
|
"handsome",
|
||||||
|
"pretty",
|
||||||
|
"beautiful"
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
"old",
|
||||||
|
"young"
|
||||||
|
],
|
||||||
|
"chance": 0.5,
|
||||||
|
"join": ", "
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"name": "eye-color",
|
||||||
|
"variants": [
|
||||||
|
"blue",
|
||||||
|
"amber",
|
||||||
|
"green",
|
||||||
|
"brown"
|
||||||
|
],
|
||||||
|
"depends": [{
|
||||||
|
"variants": "any",
|
||||||
|
"depends": "color-modifier",
|
||||||
|
"chance": 0.3,
|
||||||
|
"order": "{color-modifier} {base}",
|
||||||
|
"weights": [
|
||||||
|
[1, "light"],
|
||||||
|
[1, "dark"],
|
||||||
|
[1, "pale"],
|
||||||
|
[1, "bright"]
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"name": "post-descriptor",
|
||||||
|
"variants": [
|
||||||
|
"long claws",
|
||||||
|
"a twisted paw",
|
||||||
|
"eyes",
|
||||||
|
"paws",
|
||||||
|
"stripes",
|
||||||
|
"spots",
|
||||||
|
"splotches"
|
||||||
|
],
|
||||||
|
"depends": [{
|
||||||
|
"variants": ["eyes"],
|
||||||
|
"depends": "eye-color",
|
||||||
|
"chance": 1,
|
||||||
|
"order": "{eye-color} {base}"
|
||||||
|
}, {
|
||||||
|
"variants": [
|
||||||
|
"paws",
|
||||||
|
"stripes",
|
||||||
|
"spots",
|
||||||
|
"splotches"
|
||||||
|
],
|
||||||
|
"depends": "pelt-color",
|
||||||
|
"chance": 1,
|
||||||
|
"order": "{pelt-color} {base}"
|
||||||
|
}],
|
||||||
|
"next": [{
|
||||||
|
"from": "any",
|
||||||
|
"to": "any",
|
||||||
|
"chance": 0.4,
|
||||||
|
"join": " and "
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"name": "solid",
|
||||||
|
"variants": ["solid"]
|
||||||
|
}, {
|
||||||
|
"name": "very",
|
||||||
|
"variants": ["very"]
|
||||||
|
}, {
|
||||||
|
"name": "color-modifier",
|
||||||
|
"variants": [
|
||||||
|
"dark",
|
||||||
|
"light",
|
||||||
|
"pale",
|
||||||
|
"bright",
|
||||||
|
"jet"
|
||||||
|
],
|
||||||
|
"depends": [{
|
||||||
|
"variants": [
|
||||||
|
"light",
|
||||||
|
"pale",
|
||||||
|
"dark",
|
||||||
|
"bright"
|
||||||
|
],
|
||||||
|
"depends": "very",
|
||||||
|
"chance": 0.2,
|
||||||
|
"order": "{very} {base}"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"name": "pelt-color",
|
||||||
|
"variants": [
|
||||||
|
"black",
|
||||||
|
"black-and-white",
|
||||||
|
"black-and-gray",
|
||||||
|
"gray",
|
||||||
|
"gray-and-white",
|
||||||
|
"silver",
|
||||||
|
"blue-gray",
|
||||||
|
"ginger",
|
||||||
|
"brown",
|
||||||
|
"reddish-brown",
|
||||||
|
"golden",
|
||||||
|
"golden-brown",
|
||||||
|
"dusky-brown",
|
||||||
|
"white"
|
||||||
|
],
|
||||||
|
"depends": [{
|
||||||
|
"variants": ["black"],
|
||||||
|
"depends": "color-modifier",
|
||||||
|
"chance": 0.3,
|
||||||
|
"order": "{color-modifier} {base}",
|
||||||
|
"weights": [
|
||||||
|
[1, "dark"],
|
||||||
|
[2, "jet"]
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"variants": [
|
||||||
|
"gray",
|
||||||
|
"silver",
|
||||||
|
"blue-gray",
|
||||||
|
"ginger",
|
||||||
|
"brown",
|
||||||
|
"reddish-brown",
|
||||||
|
"golden",
|
||||||
|
"golden-brown"
|
||||||
|
],
|
||||||
|
"depends": "color-modifier",
|
||||||
|
"chance": 0.3,
|
||||||
|
"order": "{color-modifier} {base}",
|
||||||
|
"weights": [
|
||||||
|
[1, "dark"],
|
||||||
|
[1, "light"],
|
||||||
|
[1, "pale"],
|
||||||
|
[1, "bright"]
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"variants": ["white"],
|
||||||
|
"depends": "color-modifier",
|
||||||
|
"chance": 0.3,
|
||||||
|
"order": "{color-modifier} {base}",
|
||||||
|
"weights": [
|
||||||
|
[1, "bright"]
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"variants": [
|
||||||
|
"black",
|
||||||
|
"gray",
|
||||||
|
"silver",
|
||||||
|
"blue-gray",
|
||||||
|
"ginger",
|
||||||
|
"brown",
|
||||||
|
"reddish-brown",
|
||||||
|
"golden",
|
||||||
|
"golden-brown",
|
||||||
|
"dusky-brown",
|
||||||
|
"white"
|
||||||
|
],
|
||||||
|
"depends": "solid",
|
||||||
|
"chance": 0.2,
|
||||||
|
"order": "{solid} {base}"
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
"name": "gembder",
|
||||||
|
"variants": [
|
||||||
|
"she-cat",
|
||||||
|
"queen",
|
||||||
|
"tom"
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"name": "pelt",
|
||||||
|
"variants": [
|
||||||
|
"tortoiseshell",
|
||||||
|
"tabby",
|
||||||
|
"cat"
|
||||||
|
],
|
||||||
|
"silent": ["cat"],
|
||||||
|
"depends": [{
|
||||||
|
"variants": [
|
||||||
|
"tortoiseshell",
|
||||||
|
"tabby"
|
||||||
|
],
|
||||||
|
"depends": "pelt-color",
|
||||||
|
"forbids": [{
|
||||||
|
"name": "solid",
|
||||||
|
"variants": ["solid"]
|
||||||
|
}],
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{pelt-color} {base}"
|
||||||
|
}, {
|
||||||
|
"variants": ["cat"],
|
||||||
|
"depends": "pelt-color",
|
||||||
|
"chance": 1,
|
||||||
|
"order": "{pelt-color} {base}"
|
||||||
|
}, {
|
||||||
|
"variants": ["tortoiseshell"],
|
||||||
|
"depends": "gembder",
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{base} {gembder}",
|
||||||
|
"weights": [
|
||||||
|
[80, "she-cat"],
|
||||||
|
[20, "queen"],
|
||||||
|
[1, "tom"]
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"variants": ["tabby"],
|
||||||
|
"depends": "gembder",
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{base} {gembder}"
|
||||||
|
}, {
|
||||||
|
"variants": ["cat"],
|
||||||
|
"depends": "gembder",
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{base} {gembder}",
|
||||||
|
"default": "cat"
|
||||||
|
}, {
|
||||||
|
"variants": [
|
||||||
|
"tabby",
|
||||||
|
"tortoiseshell"
|
||||||
|
],
|
||||||
|
"depends": "descriptor",
|
||||||
|
"forbids": [{
|
||||||
|
"name": "descriptor",
|
||||||
|
"variants": ["mottled"]
|
||||||
|
}],
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{descriptor} {base}"
|
||||||
|
}, {
|
||||||
|
"variants": ["cat"],
|
||||||
|
"depends": "descriptor",
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{descriptor} {base}"
|
||||||
|
}, {
|
||||||
|
"variants": ["tabby"],
|
||||||
|
"depends": "post-descriptor",
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{base} with {post-descriptor}",
|
||||||
|
"weights": [
|
||||||
|
[2, "long claws"],
|
||||||
|
[1, "a twisted paw"],
|
||||||
|
[4, "eyes"],
|
||||||
|
[3, "paws"],
|
||||||
|
[2, "stripes"]
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"variants": ["tortoiseshell"],
|
||||||
|
"depends": "post-descriptor",
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{base} with {post-descriptor}",
|
||||||
|
"weights": [
|
||||||
|
[2, "long claws"],
|
||||||
|
[1, "a twisted paw"],
|
||||||
|
[4, "eyes"],
|
||||||
|
[3, "paws"],
|
||||||
|
[2, "splotches"]
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
"variants": ["cat"],
|
||||||
|
"depends": "post-descriptor",
|
||||||
|
"chance": 0.5,
|
||||||
|
"order": "{base} with {post-descriptor}",
|
||||||
|
"weights": [
|
||||||
|
[2, "long claws"],
|
||||||
|
[1, "a twisted paw"],
|
||||||
|
[4, "eyes"],
|
||||||
|
[3, "paws"],
|
||||||
|
[2, "spots"]
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}
|
230
Name.json
Normal file
230
Name.json
Normal file
|
@ -0,0 +1,230 @@
|
||||||
|
{
|
||||||
|
"prefix": [
|
||||||
|
"feather",
|
||||||
|
"crow",
|
||||||
|
"bramble",
|
||||||
|
"hawk",
|
||||||
|
"fire",
|
||||||
|
"red",
|
||||||
|
"lion",
|
||||||
|
"misty",
|
||||||
|
"tawny",
|
||||||
|
"gray",
|
||||||
|
"running",
|
||||||
|
"golden",
|
||||||
|
"owl",
|
||||||
|
"rabbit",
|
||||||
|
"spider",
|
||||||
|
"leaf",
|
||||||
|
"squirrel",
|
||||||
|
"oak",
|
||||||
|
"storm",
|
||||||
|
"stone",
|
||||||
|
"sand",
|
||||||
|
"dark",
|
||||||
|
"long",
|
||||||
|
"one",
|
||||||
|
"half",
|
||||||
|
"holly",
|
||||||
|
"black",
|
||||||
|
"brindle",
|
||||||
|
"leopard",
|
||||||
|
"tiger",
|
||||||
|
"moth",
|
||||||
|
"spotted",
|
||||||
|
"raven",
|
||||||
|
"sorrel",
|
||||||
|
"cloud",
|
||||||
|
"bright",
|
||||||
|
"lost",
|
||||||
|
"cedar",
|
||||||
|
"ginger",
|
||||||
|
"blue",
|
||||||
|
"white",
|
||||||
|
"willow",
|
||||||
|
"mouse",
|
||||||
|
"dust",
|
||||||
|
"frost",
|
||||||
|
"speckle",
|
||||||
|
"small",
|
||||||
|
"patch",
|
||||||
|
"dapple",
|
||||||
|
"broken",
|
||||||
|
"stumpy",
|
||||||
|
"brown",
|
||||||
|
"wet",
|
||||||
|
"claw",
|
||||||
|
"little",
|
||||||
|
"night",
|
||||||
|
"dawn",
|
||||||
|
"ash",
|
||||||
|
"tall",
|
||||||
|
"crooked",
|
||||||
|
"yellow",
|
||||||
|
"cinder",
|
||||||
|
"bracken",
|
||||||
|
"dead",
|
||||||
|
"bark",
|
||||||
|
"torn",
|
||||||
|
"morning",
|
||||||
|
"mud",
|
||||||
|
"shade",
|
||||||
|
"loud",
|
||||||
|
"silver",
|
||||||
|
"swift",
|
||||||
|
"thorn",
|
||||||
|
"heavy",
|
||||||
|
"fern",
|
||||||
|
"rowan",
|
||||||
|
"gorse",
|
||||||
|
"moss",
|
||||||
|
"russet",
|
||||||
|
"jagged",
|
||||||
|
"rain",
|
||||||
|
"soot",
|
||||||
|
"shrew",
|
||||||
|
"talon",
|
||||||
|
"weasel",
|
||||||
|
"robin",
|
||||||
|
"thistle",
|
||||||
|
"vole",
|
||||||
|
"swallow",
|
||||||
|
"splash",
|
||||||
|
"smoke",
|
||||||
|
"birch",
|
||||||
|
"larch",
|
||||||
|
"berry",
|
||||||
|
"hazel",
|
||||||
|
"web",
|
||||||
|
"rush",
|
||||||
|
"beech",
|
||||||
|
"reed",
|
||||||
|
"mole",
|
||||||
|
"honey",
|
||||||
|
"poppy",
|
||||||
|
"ivy",
|
||||||
|
"snow",
|
||||||
|
"kestrel",
|
||||||
|
"hare",
|
||||||
|
"breeze",
|
||||||
|
"minnow",
|
||||||
|
"pounce",
|
||||||
|
"pebble",
|
||||||
|
"ripple",
|
||||||
|
"ice",
|
||||||
|
"fox",
|
||||||
|
"dove",
|
||||||
|
"kink",
|
||||||
|
"flame",
|
||||||
|
"olive",
|
||||||
|
"snake",
|
||||||
|
"scorch",
|
||||||
|
"sedge",
|
||||||
|
"ember",
|
||||||
|
"dew",
|
||||||
|
"ant",
|
||||||
|
"heather",
|
||||||
|
"mallow",
|
||||||
|
"mint",
|
||||||
|
"nettle",
|
||||||
|
"sneeze",
|
||||||
|
"otter",
|
||||||
|
"pine",
|
||||||
|
"blossom",
|
||||||
|
"bumble",
|
||||||
|
"briar",
|
||||||
|
"rose",
|
||||||
|
"ferret",
|
||||||
|
"apple",
|
||||||
|
"rat",
|
||||||
|
"starling",
|
||||||
|
"whisker",
|
||||||
|
"furze",
|
||||||
|
"boulder",
|
||||||
|
"sun",
|
||||||
|
"mossy",
|
||||||
|
"beetle",
|
||||||
|
"petal",
|
||||||
|
"grass",
|
||||||
|
"hollow",
|
||||||
|
"dusk",
|
||||||
|
"sky",
|
||||||
|
"sharp",
|
||||||
|
"short",
|
||||||
|
"clover",
|
||||||
|
"echo",
|
||||||
|
"cherry",
|
||||||
|
"sparrow",
|
||||||
|
"rock",
|
||||||
|
"sage",
|
||||||
|
"bounce",
|
||||||
|
"tiny",
|
||||||
|
"buzzard",
|
||||||
|
"seed",
|
||||||
|
"milk",
|
||||||
|
"lark",
|
||||||
|
"sloe",
|
||||||
|
"wasp",
|
||||||
|
"ebony",
|
||||||
|
"freckle",
|
||||||
|
"billy",
|
||||||
|
"snook",
|
||||||
|
"fallow",
|
||||||
|
"lichen",
|
||||||
|
"fawn"
|
||||||
|
],
|
||||||
|
"suffix": [
|
||||||
|
"kit",
|
||||||
|
"paw",
|
||||||
|
"star",
|
||||||
|
"leaf",
|
||||||
|
"tail",
|
||||||
|
"heart",
|
||||||
|
"claw",
|
||||||
|
"storm",
|
||||||
|
"stripe",
|
||||||
|
"wind",
|
||||||
|
"pelt",
|
||||||
|
"fur",
|
||||||
|
"face",
|
||||||
|
"flower",
|
||||||
|
"ear",
|
||||||
|
"eye",
|
||||||
|
"foot",
|
||||||
|
"nose",
|
||||||
|
"cloud",
|
||||||
|
"fang",
|
||||||
|
"poppy",
|
||||||
|
"whisker",
|
||||||
|
"belly",
|
||||||
|
"stream",
|
||||||
|
"pool",
|
||||||
|
"throat",
|
||||||
|
"brook",
|
||||||
|
"tooth",
|
||||||
|
"step",
|
||||||
|
"frost",
|
||||||
|
"wing",
|
||||||
|
"fall",
|
||||||
|
"bird",
|
||||||
|
"feather",
|
||||||
|
"mist",
|
||||||
|
"blaze",
|
||||||
|
"water",
|
||||||
|
"spots",
|
||||||
|
"shine",
|
||||||
|
"leap",
|
||||||
|
"petal",
|
||||||
|
"scar",
|
||||||
|
"strike",
|
||||||
|
"trout",
|
||||||
|
"willow",
|
||||||
|
"light",
|
||||||
|
"flight",
|
||||||
|
"watcher",
|
||||||
|
"dapple",
|
||||||
|
"fire",
|
||||||
|
"fern"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
23
docker/forgejo/Dockerfile
Normal file
23
docker/forgejo/Dockerfile
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
FROM alpine:3.19
|
||||||
|
|
||||||
|
ARG UID=991
|
||||||
|
ARG GID=991
|
||||||
|
|
||||||
|
ENV \
|
||||||
|
UID=${UID} \
|
||||||
|
GID=${GID}
|
||||||
|
|
||||||
|
USER root
|
||||||
|
RUN \
|
||||||
|
addgroup -g "${GID}" app && \
|
||||||
|
adduser -D -G app -u "${UID}" -g "" -h /opt/app app && \
|
||||||
|
apk add tini && \
|
||||||
|
chown -R app:app /mnt
|
||||||
|
|
||||||
|
COPY warriors-names /usr/local/bin/warriors-names
|
||||||
|
|
||||||
|
USER app
|
||||||
|
VOLUME /mnt
|
||||||
|
WORKDIR /mnt
|
||||||
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
CMD ["/usr/local/bin/warriors-names"]
|
|
@ -1,74 +0,0 @@
|
||||||
FROM rustembedded/cross:x86_64-unknown-linux-musl AS x86_64-builder
|
|
||||||
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
|
|
||||||
ENV TOOLCHAIN=stable
|
|
||||||
ENV TARGET=x86_64-unknown-linux-musl
|
|
||||||
ENV TOOL=x86_64-linux-musl
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
apt-get update && \
|
|
||||||
apt-get upgrade -y
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
addgroup --gid "${GID}" build && \
|
|
||||||
adduser \
|
|
||||||
--disabled-password \
|
|
||||||
--gecos "" \
|
|
||||||
--ingroup build \
|
|
||||||
--uid "${UID}" \
|
|
||||||
--home /opt/build \
|
|
||||||
build
|
|
||||||
|
|
||||||
ADD https://sh.rustup.rs /opt/build/rustup.sh
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chown -R build:build /opt/build
|
|
||||||
|
|
||||||
USER build
|
|
||||||
WORKDIR /opt/build
|
|
||||||
|
|
||||||
ENV PATH=/opt/build/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chmod +x rustup.sh && \
|
|
||||||
./rustup.sh --default-toolchain $TOOLCHAIN --profile minimal -y && \
|
|
||||||
rustup target add $TARGET
|
|
||||||
|
|
||||||
FROM x86_64-builder as builder
|
|
||||||
|
|
||||||
ARG TAG=main
|
|
||||||
ARG REPOSITORY=https://git.asonix.dog/asonix/warriors-names
|
|
||||||
ARG BINARY=warriors-names
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
git clone -b $TAG $REPOSITORY repo
|
|
||||||
|
|
||||||
WORKDIR /opt/build/repo
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
cargo build --release --target $TARGET && \
|
|
||||||
$TOOL-strip target/$TARGET/release/$BINARY
|
|
||||||
|
|
||||||
FROM amd64/alpine:3.11
|
|
||||||
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
ARG BINARY=warriors-names
|
|
||||||
|
|
||||||
COPY --from=builder /opt/build/repo/target/x86_64-unknown-linux-musl/release/$BINARY /usr/bin/$BINARY
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
apk add tini && \
|
|
||||||
addgroup -g $GID warriors && \
|
|
||||||
adduser -D -G warriors -u $UID -g "" -h /opt/warriors warriors
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chown -R warriors:warriors /mnt
|
|
||||||
|
|
||||||
VOLUME /mnt
|
|
||||||
WORKDIR /opt/warriors
|
|
||||||
USER warriors
|
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
|
||||||
CMD ["/usr/bin/warriors-names"]
|
|
|
@ -1,74 +0,0 @@
|
||||||
FROM rustembedded/cross:arm-unknown-linux-musleabihf AS arm32v7-builder
|
|
||||||
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
|
|
||||||
ENV TOOLCHAIN=stable
|
|
||||||
ENV TARGET=arm-unknown-linux-musleabihf
|
|
||||||
ENV TOOL=arm-linux-musleabihf
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
apt-get update && \
|
|
||||||
apt-get upgrade -y
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
addgroup --gid "${GID}" build && \
|
|
||||||
adduser \
|
|
||||||
--disabled-password \
|
|
||||||
--gecos "" \
|
|
||||||
--ingroup build \
|
|
||||||
--uid "${UID}" \
|
|
||||||
--home /opt/build \
|
|
||||||
build
|
|
||||||
|
|
||||||
ADD https://sh.rustup.rs /opt/build/rustup.sh
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chown -R build:build /opt/build
|
|
||||||
|
|
||||||
USER build
|
|
||||||
WORKDIR /opt/build
|
|
||||||
|
|
||||||
ENV PATH=/opt/build/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chmod +x rustup.sh && \
|
|
||||||
./rustup.sh --default-toolchain $TOOLCHAIN --profile minimal -y && \
|
|
||||||
rustup target add $TARGET
|
|
||||||
|
|
||||||
FROM arm32v7-builder as builder
|
|
||||||
|
|
||||||
ARG TAG=main
|
|
||||||
ARG REPOSITORY=https://git.asonix.dog/asonix/warriors-names
|
|
||||||
ARG BINARY=warriors-names
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
git clone -b $TAG $REPOSITORY repo
|
|
||||||
|
|
||||||
WORKDIR /opt/build/repo
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
cargo build --release --target $TARGET && \
|
|
||||||
$TOOL-strip target/$TARGET/release/$BINARY
|
|
||||||
|
|
||||||
FROM arm32v7/alpine:3.11
|
|
||||||
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
ARG BINARY=warriors-names
|
|
||||||
|
|
||||||
COPY --from=builder /opt/build/repo/target/arm-unknown-linux-musleabihf/release/$BINARY /usr/bin/$BINARY
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
apk add tini && \
|
|
||||||
addgroup -g $GID warriors && \
|
|
||||||
adduser -D -G warriors -u $UID -g "" -h /opt/warriors warriors
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chown -R warriors:warriors /mnt
|
|
||||||
|
|
||||||
VOLUME /mnt
|
|
||||||
WORKDIR /opt/warriors
|
|
||||||
USER warriors
|
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
|
||||||
CMD ["/usr/bin/warriors-names"]
|
|
|
@ -1,74 +0,0 @@
|
||||||
FROM rustembedded/cross:aarch64-unknown-linux-musl AS aarch64-builder
|
|
||||||
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
|
|
||||||
ENV TOOLCHAIN=stable
|
|
||||||
ENV TARGET=aarch64-unknown-linux-musl
|
|
||||||
ENV TOOL=aarch64-linux-musl
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
apt-get update && \
|
|
||||||
apt-get upgrade -y
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
addgroup --gid "${GID}" build && \
|
|
||||||
adduser \
|
|
||||||
--disabled-password \
|
|
||||||
--gecos "" \
|
|
||||||
--ingroup build \
|
|
||||||
--uid "${UID}" \
|
|
||||||
--home /opt/build \
|
|
||||||
build
|
|
||||||
|
|
||||||
ADD https://sh.rustup.rs /opt/build/rustup.sh
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chown -R build:build /opt/build
|
|
||||||
|
|
||||||
USER build
|
|
||||||
WORKDIR /opt/build
|
|
||||||
|
|
||||||
ENV PATH=/opt/build/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chmod +x rustup.sh && \
|
|
||||||
./rustup.sh --default-toolchain $TOOLCHAIN --profile minimal -y && \
|
|
||||||
rustup target add $TARGET
|
|
||||||
|
|
||||||
FROM aarch64-builder as builder
|
|
||||||
|
|
||||||
ARG TAG=main
|
|
||||||
ARG REPOSITORY=https://git.asonix.dog/asonix/warriors-names
|
|
||||||
ARG BINARY=warriors-names
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
git clone -b $TAG $REPOSITORY repo
|
|
||||||
|
|
||||||
WORKDIR /opt/build/repo
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
cargo build --release --target $TARGET && \
|
|
||||||
$TOOL-strip target/$TARGET/release/$BINARY
|
|
||||||
|
|
||||||
FROM arm64v8/alpine:3.11
|
|
||||||
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
ARG BINARY=warriors-names
|
|
||||||
|
|
||||||
COPY --from=builder /opt/build/repo/target/aarch64-unknown-linux-musl/release/$BINARY /usr/bin/$BINARY
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
apk add tini && \
|
|
||||||
addgroup -g $GID warriors && \
|
|
||||||
adduser -D -G warriors -u $UID -g "" -h /opt/warriors warriors
|
|
||||||
|
|
||||||
RUN \
|
|
||||||
chown -R warriors:warriors /mnt
|
|
||||||
|
|
||||||
VOLUME /mnt
|
|
||||||
WORKDIR /opt/warriors
|
|
||||||
USER warriors
|
|
||||||
ENTRYPOINT ["/sbin/tini", "--"]
|
|
||||||
CMD ["/usr/bin/warriors-names"]
|
|
|
@ -1,76 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
function require() {
|
|
||||||
if [ "$1" = "" ]; then
|
|
||||||
echo "input '$2' required"
|
|
||||||
print_help
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function print_help() {
|
|
||||||
echo "deploy.sh"
|
|
||||||
echo ""
|
|
||||||
echo "Usage:"
|
|
||||||
echo " deploy.sh [tag]"
|
|
||||||
echo ""
|
|
||||||
echo "Args:"
|
|
||||||
echo " tag: The git tag to be applied to the repository and docker build"
|
|
||||||
echo " branch: The git branch to use for tagging and publishing"
|
|
||||||
}
|
|
||||||
|
|
||||||
function build_image() {
|
|
||||||
tag=$1
|
|
||||||
arch=$2
|
|
||||||
|
|
||||||
docker build \
|
|
||||||
--pull \
|
|
||||||
--build-arg TAG=$tag \
|
|
||||||
-t asonix/warriors-names:$arch-$tag \
|
|
||||||
-t asonix/warriors-names:$arch-latest \
|
|
||||||
-f Dockerfile.$arch \
|
|
||||||
.
|
|
||||||
|
|
||||||
docker push asonix/warriors-names:$arch-$tag
|
|
||||||
docker push asonix/warriors-names:$arch-latest
|
|
||||||
}
|
|
||||||
|
|
||||||
# Creating the new tag
|
|
||||||
new_tag="$1"
|
|
||||||
branch="$2"
|
|
||||||
|
|
||||||
require "$new_tag" "tag"
|
|
||||||
require "$branch" "branch"
|
|
||||||
|
|
||||||
if ! docker run --rm -it arm64v8/alpine:3.11 /bin/sh -c 'echo "docker is configured correctly"'
|
|
||||||
then
|
|
||||||
echo "docker is not configured to run on qemu-emulated architectures, fixing will require sudo"
|
|
||||||
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
git checkout $branch
|
|
||||||
|
|
||||||
# Changing the docker-compose prod
|
|
||||||
sed -i "s/asonix\/warriors-names:.*/asonix\/warriors-names:$new_tag/" docker-compose.yml
|
|
||||||
git add ../prod/docker-compose.yml
|
|
||||||
|
|
||||||
# The commit
|
|
||||||
git commit -m"Version $new_tag"
|
|
||||||
git tag $new_tag
|
|
||||||
|
|
||||||
# Push
|
|
||||||
git push origin $new_tag
|
|
||||||
git push
|
|
||||||
|
|
||||||
# Build for arm64v8, arm32v7, and amd64
|
|
||||||
build_image $new_tag arm64v8
|
|
||||||
build_image $new_tag arm32v7
|
|
||||||
build_image $new_tag amd64
|
|
||||||
|
|
||||||
# Build for other archs
|
|
||||||
# TODO
|
|
||||||
|
|
||||||
./manifest.sh asonix/warriors-names $new_tag
|
|
||||||
./manifest.sh asonix/warriors-names latest
|
|
|
@ -2,7 +2,7 @@ version: '3.3'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
warriors-names:
|
warriors-names:
|
||||||
image: asonix/warriors-names:v0.1.1-r0
|
image: asonix/warriors-names:v0.2.1
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
volumes:
|
||||||
- ./volumes/warriors-names:/opt/warriors
|
- ./volumes/warriors-names:/opt/warriors
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
function require() {
|
|
||||||
if [ "$1" = "" ]; then
|
|
||||||
echo "input '$2' required"
|
|
||||||
print_help
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
function print_help() {
|
|
||||||
echo "deploy.sh"
|
|
||||||
echo ""
|
|
||||||
echo "Usage:"
|
|
||||||
echo " manifest.sh [repository] [tag]"
|
|
||||||
echo ""
|
|
||||||
echo "Args:"
|
|
||||||
echo " repository: The docker repository hosting the images"
|
|
||||||
echo " tag: The git tag to be applied to the image manifest"
|
|
||||||
}
|
|
||||||
|
|
||||||
repo=$1
|
|
||||||
new_tag=$2
|
|
||||||
|
|
||||||
require "$repo" "repository"
|
|
||||||
require "$new_tag" "tag"
|
|
||||||
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
docker manifest create $repo:$new_tag \
|
|
||||||
-a $repo:arm64v8-$new_tag \
|
|
||||||
-a $repo:arm32v7-$new_tag \
|
|
||||||
-a $repo:amd64-$new_tag
|
|
||||||
|
|
||||||
docker manifest annotate $repo:$new_tag \
|
|
||||||
$repo:arm64v8-$new_tag --os linux --arch arm64 --variant v8
|
|
||||||
|
|
||||||
docker manifest annotate $repo:$new_tag \
|
|
||||||
$repo:arm32v7-$new_tag --os linux --arch arm --variant v7
|
|
||||||
|
|
||||||
docker manifest annotate $repo:$new_tag \
|
|
||||||
$repo:amd64-$new_tag --os linux --arch amd64
|
|
||||||
|
|
||||||
docker manifest push $repo:$new_tag --purge
|
|
61
flake.lock
Normal file
61
flake.lock
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705309234,
|
||||||
|
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1707546158,
|
||||||
|
"narHash": "sha256-nYYJTpzfPMDxI8mzhQsYjIUX+grorqjKEU9Np6Xwy/0=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "d934204a0f8d9198e1e4515dd6fec76a139c87f0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
34
flake.nix
Normal file
34
flake.nix
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
description = "warriors-names";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, flake-utils }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = rec {
|
||||||
|
warriors-names = pkgs.callPackage ./warriors-names.nix { };
|
||||||
|
|
||||||
|
default = warriors-names;
|
||||||
|
};
|
||||||
|
|
||||||
|
apps = rec {
|
||||||
|
dev = flake-utils.lib.mkApp { drv = self.packages.${system}.warriors-names; };
|
||||||
|
default = dev;
|
||||||
|
};
|
||||||
|
|
||||||
|
devShell = with pkgs; mkShell {
|
||||||
|
nativeBuildInputs = [ cargo cargo-outdated clippy gcc rust-analyzer rustc rustfmt ];
|
||||||
|
|
||||||
|
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
File diff suppressed because it is too large
Load diff
83
src/main.rs
83
src/main.rs
|
@ -1,22 +1,19 @@
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
use rand::{seq::SliceRandom, thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
use reqwest::{header::HeaderMap, Client};
|
use reqwest::{header::HeaderMap, Client};
|
||||||
use std::{path::Path, time::Duration};
|
use std::{path::Path, time::Duration};
|
||||||
use tokio::{fs::File, prelude::*, time::interval};
|
use tokio::{fs::File, io::AsyncReadExt, io::AsyncWriteExt, time::interval};
|
||||||
use tokio_compat_02::FutureExt;
|
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
mod description;
|
mod description;
|
||||||
|
mod name;
|
||||||
|
|
||||||
const DEFAULT_PREFIX: &str = "fire";
|
|
||||||
const DEFAULT_SUFFIX: &str = "paw";
|
|
||||||
const USER_AGENT: &str = "warriors-cats";
|
const USER_AGENT: &str = "warriors-cats";
|
||||||
const TOKEN_PATH: &str = "/oauth/token";
|
const TOKEN_PATH: &str = "/oauth/token";
|
||||||
const STATUS_URL: &str = "/api/v1/statuses";
|
const STATUS_URL: &str = "/api/v1/statuses";
|
||||||
|
|
||||||
#[derive(serde::Deserialize)]
|
#[derive(serde::Deserialize)]
|
||||||
struct Config {
|
struct Config {
|
||||||
names: Names,
|
|
||||||
timing: Timing,
|
timing: Timing,
|
||||||
mastodon: Mastodon,
|
mastodon: Mastodon,
|
||||||
}
|
}
|
||||||
|
@ -34,17 +31,11 @@ struct Timing {
|
||||||
duration: u32,
|
duration: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(serde::Deserialize)]
|
|
||||||
struct Names {
|
|
||||||
prefix: Vec<String>,
|
|
||||||
suffix: Vec<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
server: Url,
|
server: Url,
|
||||||
client: Client,
|
client: Client,
|
||||||
prefix: Vec<String>,
|
name: name::Config,
|
||||||
suffix: Vec<String>,
|
description: description::Config,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(serde::Serialize)]
|
#[derive(serde::Serialize)]
|
||||||
|
@ -87,7 +78,6 @@ impl Mastodon {
|
||||||
scope: "read write",
|
scope: "read write",
|
||||||
})
|
})
|
||||||
.send()
|
.send()
|
||||||
.compat()
|
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if !res.status().is_success() {
|
if !res.status().is_success() {
|
||||||
|
@ -97,40 +87,44 @@ impl Mastodon {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let token: Token = res.json().compat().await?;
|
let token: Token = res.json().await?;
|
||||||
Ok(token)
|
Ok(token)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn read_token(path: impl AsRef<Path>) -> Result<Token> {
|
async fn read_token(path: impl AsRef<Path>) -> Result<Token> {
|
||||||
let mut file = File::open(path).await?;
|
let mut file = File::open(path).await?;
|
||||||
let mut contents = vec![];
|
let mut contents = String::new();
|
||||||
file.read_to_end(&mut contents).await?;
|
file.read_to_string(&mut contents).await?;
|
||||||
|
|
||||||
let token: Token = toml::from_slice(&contents)?;
|
let token: Token = toml::from_str(&contents)?;
|
||||||
Ok(token)
|
Ok(token)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn write_token(path: impl AsRef<Path>, token: &Token) -> Result<()> {
|
async fn write_token(path: impl AsRef<Path>, token: &Token) -> Result<()> {
|
||||||
let token_bytes = toml::to_vec(token)?;
|
let token_bytes = toml::to_string(token)?;
|
||||||
let mut file = File::create(path).await?;
|
let mut file = File::create(path).await?;
|
||||||
file.write_all(&token_bytes).await?;
|
file.write_all(token_bytes.as_bytes()).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
async fn open(path: impl AsRef<Path>) -> Result<Self> {
|
async fn open(path: impl AsRef<Path>) -> Result<Self> {
|
||||||
let mut file = File::open(path).await?;
|
let mut file = File::open(path).await?;
|
||||||
let mut contents = vec![];
|
let mut contents = String::new();
|
||||||
file.read_to_end(&mut contents).await?;
|
file.read_to_string(&mut contents).await?;
|
||||||
|
|
||||||
let config: Config = toml::from_slice(&contents)?;
|
let config: Config = toml::from_str(&contents)?;
|
||||||
Ok(config)
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn to_state(self, token_path: impl AsRef<Path>) -> Result<State> {
|
async fn into_state(
|
||||||
|
self,
|
||||||
|
token_path: impl AsRef<Path>,
|
||||||
|
name: name::Config,
|
||||||
|
description: description::Config,
|
||||||
|
) -> Result<State> {
|
||||||
let Config {
|
let Config {
|
||||||
names,
|
|
||||||
timing: _,
|
timing: _,
|
||||||
mastodon,
|
mastodon,
|
||||||
} = self;
|
} = self;
|
||||||
|
@ -160,16 +154,14 @@ impl Config {
|
||||||
Ok(State {
|
Ok(State {
|
||||||
server,
|
server,
|
||||||
client,
|
client,
|
||||||
prefix: names.prefix,
|
name,
|
||||||
suffix: names.suffix,
|
description,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
async fn post(&self, rng: &mut impl Rng) -> Result<()> {
|
async fn post(&self, rng: &mut impl Rng) -> Result<()> {
|
||||||
let name = self.generate(rng);
|
|
||||||
let description = description::run(rng);
|
|
||||||
let mut url = self.server.clone();
|
let mut url = self.server.clone();
|
||||||
url.set_path(STATUS_URL);
|
url.set_path(STATUS_URL);
|
||||||
|
|
||||||
|
@ -177,11 +169,10 @@ impl State {
|
||||||
.client
|
.client
|
||||||
.post(url.as_str())
|
.post(url.as_str())
|
||||||
.form(&Status {
|
.form(&Status {
|
||||||
status: format!("{} - {}", name, description),
|
status: self.gen(rng),
|
||||||
visibility: "unlisted",
|
visibility: "unlisted",
|
||||||
})
|
})
|
||||||
.send()
|
.send()
|
||||||
.compat()
|
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if !res.status().is_success() {
|
if !res.status().is_success() {
|
||||||
|
@ -191,40 +182,26 @@ impl State {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate(&self, rng: &mut impl Rng) -> String {
|
fn gen(&self, rng: &mut impl Rng) -> String {
|
||||||
let prefix = self
|
let name = self.name.gen(rng);
|
||||||
.prefix
|
let description = self.description.gen(rng);
|
||||||
.choose(rng)
|
|
||||||
.map(|s| s.as_str())
|
|
||||||
.unwrap_or(DEFAULT_PREFIX);
|
|
||||||
|
|
||||||
let mut suffix;
|
format!("{} - {}", name, description)
|
||||||
while {
|
|
||||||
suffix = self
|
|
||||||
.suffix
|
|
||||||
.choose(rng)
|
|
||||||
.map(|s| s.as_str())
|
|
||||||
.unwrap_or(DEFAULT_SUFFIX);
|
|
||||||
suffix == prefix
|
|
||||||
} {}
|
|
||||||
|
|
||||||
let (first, rest) = prefix.split_at(1);
|
|
||||||
|
|
||||||
first.to_uppercase() + rest + &suffix
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
let config = Config::open("Config.toml").await?;
|
let config = Config::open("Config.toml").await?;
|
||||||
|
let name = name::config("Name.json").await?;
|
||||||
|
let description = description::config("Description.json").await?;
|
||||||
|
|
||||||
let duration = Duration::from_secs(60) * config.timing.duration;
|
let duration = Duration::from_secs(60) * config.timing.duration;
|
||||||
let mut ticker = interval(duration);
|
let mut ticker = interval(duration);
|
||||||
|
|
||||||
let state = config.to_state("Token.toml").await?;
|
let state = config.into_state("Token.toml", name, description).await?;
|
||||||
|
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
ticker.tick().await;
|
ticker.tick().await;
|
||||||
state.post(&mut rng).await?;
|
state.post(&mut rng).await?;
|
||||||
|
|
34
src/name.rs
Normal file
34
src/name.rs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
use anyhow::Result;
|
||||||
|
use rand::{seq::SliceRandom, Rng};
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
pub(crate) struct Config {
|
||||||
|
prefix: Vec<String>,
|
||||||
|
suffix: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Config {
|
||||||
|
pub(crate) fn gen(&self, rng: &mut impl Rng) -> String {
|
||||||
|
let prefix = self.prefix.choose(rng).map(|s| s.as_str()).unwrap();
|
||||||
|
|
||||||
|
let suffixes = self
|
||||||
|
.suffix
|
||||||
|
.iter()
|
||||||
|
.filter(|s| *s != prefix)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let suffix = suffixes.choose(rng).unwrap().to_string();
|
||||||
|
|
||||||
|
let (first, rest) = prefix.split_at(1);
|
||||||
|
|
||||||
|
first.to_uppercase() + rest + &suffix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn config(path: impl AsRef<Path>) -> Result<Config> {
|
||||||
|
let bytes = tokio::fs::read(path).await?;
|
||||||
|
let config: Config = serde_json::from_slice(&bytes)?;
|
||||||
|
|
||||||
|
Ok(config)
|
||||||
|
}
|
21
warriors-names.nix
Normal file
21
warriors-names.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ lib
|
||||||
|
, nixosTests
|
||||||
|
, rustPlatform
|
||||||
|
}:
|
||||||
|
|
||||||
|
rustPlatform.buildRustPackage {
|
||||||
|
pname = "warriors-names";
|
||||||
|
version = "0.2.3";
|
||||||
|
src = ./.;
|
||||||
|
cargoLock.lockFile = ./Cargo.lock;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ ];
|
||||||
|
|
||||||
|
passthru.tests = { inherit (nixosTests) warriors-names; };
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "A simple image hosting service";
|
||||||
|
homepage = "https://git.asonix.dog/asonix/warriors-names";
|
||||||
|
license = with licenses; [ agpl3Plus ];
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue