rsticle 0.1.2

Treat source files as articles / narrative documentation
Documentation
const REPO = "https://codeberg.org/api/v1/repos/wldmr/rsticle"

# Get package version from Cargo.toml
export def package-version [] {
  let root = (cargo locate-project --workspace) | from json | get root
  open $root | get workspace.package.version
}

export def git-tags [] {
  git tag | lines
}

export module codeberg {
  export def --env login [token?] {
    $env.CODEBERG_ACCESS_TOKEN = if ($token | is-not-empty) { $token } else { input "Codeberg Access Token: " }
  }

  def auth-header [] {
    if ($env.CODEBERG_ACCESS_TOKEN? | is-empty) {
      error make {msg: "Must set CODEBERG_ACCESS_TOKEN environment variable (or use `codeberg login`)"}
    }
    {Authorization: $"token ($env.CODEBERG_ACCESS_TOKEN)"}
  }

  export def release [tag:string@git-tags] {
    http get $"($REPO)/releases/tags/($tag)"
  }

  export def "release new" [
    # Name of the tag/release
    tag:string@git-tags
    # Path to the the release notes file.
    #
    # Will become the body text of the release
    release_notes:path
  ] {
    http post $"($REPO)/releases" -t application/json --headers (auth-header) {
      tag_name: $tag,
      body: (open $release_notes),
    }
  }

  export def "release delete" [tag:string@git-tags] {
    http delete $"($REPO)/releases/tags/($tag)" -H (auth-header)
  }

  export def "release upload" [
    # Name of the tag/release
    tag:string@git-tags
    # The files to upload
    files:list
  ] {

    let release_id = release $tag | get id

    let ASSETS = $"($REPO)/releases/($release_id)/assets";
    $files | each { |file|
      http post $ASSETS -t multipart/form-data -H (auth-header) {
        name: ($file | path basename),
        attachment: (open --raw $file | into binary)
      };
    }
  }

}