swift-package 0.1.1

Cargo plugin and library for building Apple Swift Packages
Documentation
use crate::conf::Configuration;
use anyhow::Result;
use camino_fs::Utf8PathExt;
use xcframework::Produced;

pub fn generate(conf: &Configuration, produced: &Produced, resource_dirs: &[&str]) -> Result<()> {
    let module_name = &produced.module_name;
    let package_name = &conf.cargo_section.package_name;

    let xcframework_ext = if produced.is_zipped {
        "xcframework.zip"
    } else {
        "xcframework"
    };
    let resources = resource_dirs
        .iter()
        .map(|dir| format!(".copy(\"{dir}\")"))
        .collect::<Vec<_>>()
        .join(", ");

    let contents = format!(
        r###"// swift-tools-version:5.7.1
import PackageDescription
let package = Package(
  name: "{package_name}",
  products: [
    .library(
      name: "{package_name}",
      targets: ["{package_name}"]),
  ],
  dependencies: [],
  targets: [
    .binaryTarget(
      name: "{module_name}",
      path: "{module_name}.{xcframework_ext}"
    ),
    .target(
      name: "{package_name}",
      dependencies: ["{module_name}"],
      resources: [{resources}]
    )
  ]
)
  "###,
    );
    conf.framework_build_dir
        .join("Package.swift")
        .write(contents)?;
    Ok(())
}