You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: main.rs
    path of file: ./repos/jasmine/ci/src/check_asset
    
    the code of the file until where you have to start completion: use anyhow::Result;
use serde_derive::Deserialize;
use serde_derive::Serialize;
use serde_json::Value;

const OWNER: &str = "niuhuan";
const REPO: &str = "jasmine";
const UA: &str = "niuhuan jasmine ci";

#[tokio::main]
async fn main() -> Result<()> {
    let gh_token = std::env::var("GITHUB_TOKEN")?;
    if gh_token.is_empty() {
        panic!("Please set GITHUB_TOKEN");
    }
    let flutter_version = std::env::var("flutter_version")?;
    if flutter_version.is_empty() {
        panic!("Please set flutter_version");
    }

    let target = std::env::var("TARGET")?;

    let vs_code_txt = tokio::fs::read_to_string("version.code.txt").await?;

    let code = vs_code_txt.trim();

    let mut release_file_name = match target.as_str() {
        "macos" => format!("jasmine-{}.dmg", code),
        "ios" => format!("jasmine-{}-nosign.ipa", code),
        "windows" => format!("jasmine-{}-windows-x86_64.zip", code),
        "linux" => format!("jasmine-{}-x86_64.AppImage", code),
        "android-arm32" => format!("jasmine-{}-arm32.apk", code),
        "android-arm64" => format!("jasmine-{}-arm64.apk", code),
        "andro
    
async fn main() -> Result<()> {
    let gh_token = std::env::var("GITHUB_TOKEN")?;
    if gh_token.is_empty() {
        panic!("Please set GITHUB_TOKEN");
    }
    let flutter_version = std::env::var("flutter_version")?;
    if flutter_version.is_empty() {
        panic!("Please set flutter_version");
    }

    let target = std::env::var("TARGET")?;

    let vs_code_txt = tokio::fs::read_to_string("version.code.txt").await?;

    let code = vs_code_txt.trim();

    let mut release_file_name = match target.as_str() {
        "macos" => format!("jasmine-{}.dmg", code),
        "ios" => format!("jasmine-{}-nosign.ipa", code),
        "windows" => format!("jasmine-{}-windows-x86_64.zip", code),
        "linux" => format!("jasmine-{}-x86_64.AppImage", code),
        "android-arm32" => format!("jasmine-{}-arm32.apk", code),
        "android-arm64" => format!("jasmine-{}-arm64.apk", code),
        "android-x86_64" => format!("jasmine-{}-x86_64.apk", code),
        un => panic!("unknown target : {}", un),
    };
    if flutter_version.starts_with("2.") {
        release_file_name = format!("z-of-{}", release_file_name);
    }

    let client = reqwest::ClientBuilder::new().user_agent(UA).build()?;

    let check_response = client
        .get(format!(
            "https://api.github.com/repos/{}/{}/releases/tags/{}",
            OWNER, REPO, code
        ))
        .header("Authorization", format!("token {}", gh_token))
        .send()
        .await?;

    match check_response.status().as_u16() {
        200 => (),
        404 => println!("release not exists"),
        code => {
            let text = check_response.text().await?;
            panic!("error for check release : {} : {}", code, text);
        }
    }
    let release: Release = check_response.json().await?;

    let ass_names: Vec<String> = release.assets.iter().map(|a| a.name.clone()).collect();
    println!(
        "::set-output name=skip_build::{}",
        ass_names.contains(&release_file_name)
    );
    Ok(())
}