diff --git a/.changes/fix-tauri-plugin-ios-init.md b/.changes/fix-tauri-plugin-ios-init.md new file mode 100644 index 000000000..c0102c5db --- /dev/null +++ b/.changes/fix-tauri-plugin-ios-init.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": patch:bug +"@tauri-apps/cli": patch:bug +--- + +Fix `tauri plugin ios init` not generating the iOS folder. diff --git a/tooling/cli/src/plugin/init.rs b/tooling/cli/src/plugin/init.rs index ffa3a7dd8..33f5f099c 100644 --- a/tooling/cli/src/plugin/init.rs +++ b/tooling/cli/src/plugin/init.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT +use super::PluginIosFramework; use crate::helpers::prompts; use crate::Result; use crate::{ @@ -9,7 +10,7 @@ use crate::{ VersionMetadata, }; use anyhow::Context; -use clap::{Parser, ValueEnum}; +use clap::Parser; use handlebars::{to_json, Handlebars}; use heck::{ToKebabCase, ToPascalCase, ToSnakeCase}; use include_dir::{include_dir, Dir}; @@ -56,15 +57,8 @@ pub struct Options { pub(crate) mobile: bool, /// Type of framework to use for the iOS project. #[clap(long)] - pub(crate) ios_framework: Option, -} - -#[derive(Debug, Clone, ValueEnum)] -pub enum IosFrameworkKind { - /// Swift Package Manager project - Spm, - /// Xcode project - Xcode, + #[clap(default_value_t = PluginIosFramework::default())] + pub(crate) ios_framework: PluginIosFramework, } impl Options { @@ -167,7 +161,7 @@ pub fn command(mut options: Options) -> Result<()> { None }; - let ios_framework = options.ios_framework.unwrap_or(IosFrameworkKind::Spm); + let ios_framework = options.ios_framework; let mut created_dirs = Vec::new(); template::render_with_generator( @@ -208,8 +202,8 @@ pub fn command(mut options: Options) -> Result<()> { } } "ios-spm" | "ios-xcode" if !(options.ios || options.mobile) => return Ok(None), - "ios-spm" if !matches!(ios_framework, IosFrameworkKind::Spm) => return Ok(None), - "ios-xcode" if !matches!(ios_framework, IosFrameworkKind::Xcode) => return Ok(None), + "ios-spm" if !matches!(ios_framework, PluginIosFramework::Spm) => return Ok(None), + "ios-xcode" if !matches!(ios_framework, PluginIosFramework::Xcode) => return Ok(None), "ios-spm" | "ios-xcode" => { let folder_name = components.next().unwrap().as_os_str().to_string_lossy(); let new_folder_name = folder_name.replace("{{ plugin_name }}", &plugin_name); diff --git a/tooling/cli/src/plugin/ios.rs b/tooling/cli/src/plugin/ios.rs index 6ecf95255..f0be47f2a 100644 --- a/tooling/cli/src/plugin/ios.rs +++ b/tooling/cli/src/plugin/ios.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT +use super::PluginIosFramework; use crate::{helpers::template, Result}; use clap::{Parser, Subcommand}; use handlebars::Handlebars; @@ -9,7 +10,7 @@ use handlebars::Handlebars; use std::{ collections::BTreeMap, env::current_dir, - ffi::OsStr, + ffi::{OsStr, OsString}, fs::{create_dir_all, File}, path::{Component, PathBuf}, }; @@ -42,6 +43,10 @@ pub struct InitOptions { #[clap(short, long)] #[clap(default_value_t = current_dir().expect("failed to read cwd").to_string_lossy().into_owned())] out_dir: String, + /// Type of framework to use for the iOS project. + #[clap(long)] + #[clap(default_value_t = PluginIosFramework::default())] + ios_framework: PluginIosFramework, } pub fn command(cli: Cli) -> Result<()> { @@ -62,6 +67,11 @@ pub fn command(cli: Cli) -> Result<()> { let mut data = BTreeMap::new(); super::init::plugin_name_data(&mut data, &plugin_name); + let ios_folder_name = match options.ios_framework { + PluginIosFramework::Spm => OsStr::new("ios-spm"), + PluginIosFramework::Xcode => OsStr::new("ios-xcode"), + }; + let mut created_dirs = Vec::new(); template::render_with_generator( &handlebars, @@ -72,7 +82,19 @@ pub fn command(cli: Cli) -> Result<()> { let mut components = path.components(); let root = components.next().unwrap(); if let Component::Normal(component) = root { - if component == OsStr::new("ios") { + if component == ios_folder_name { + let folder_name = components.next().unwrap().as_os_str().to_string_lossy(); + let new_folder_name = folder_name.replace("{{ plugin_name }}", &plugin_name); + let new_folder_name = OsString::from(&new_folder_name); + + let path = [ + Component::Normal(OsStr::new("ios")), + Component::Normal(&new_folder_name), + ] + .into_iter() + .chain(components) + .collect::(); + let path = out_dir.join(path); let parent = path.parent().unwrap().to_path_buf(); if !created_dirs.contains(&parent) { diff --git a/tooling/cli/src/plugin/mod.rs b/tooling/cli/src/plugin/mod.rs index b34e444f9..a1c5c7d9a 100644 --- a/tooling/cli/src/plugin/mod.rs +++ b/tooling/cli/src/plugin/mod.rs @@ -2,9 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use std::path::Path; +use std::{fmt::Display, path::Path}; -use clap::{Parser, Subcommand}; +use clap::{Parser, Subcommand, ValueEnum}; use crate::Result; @@ -13,6 +13,24 @@ mod init; mod ios; mod new; +#[derive(Debug, Clone, ValueEnum, Default)] +pub enum PluginIosFramework { + /// Swift Package Manager project + #[default] + Spm, + /// Xcode project + Xcode, +} + +impl Display for PluginIosFramework { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Spm => write!(f, "spm"), + Self::Xcode => write!(f, "xcode"), + } + } +} + #[derive(Parser)] #[clap( author, diff --git a/tooling/cli/src/plugin/new.rs b/tooling/cli/src/plugin/new.rs index 71be79f44..ca1799410 100644 --- a/tooling/cli/src/plugin/new.rs +++ b/tooling/cli/src/plugin/new.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT +use super::PluginIosFramework; use crate::Result; use clap::Parser; use std::path::PathBuf; @@ -37,7 +38,8 @@ pub struct Options { mobile: bool, /// Type of framework to use for the iOS project. #[clap(long)] - pub(crate) ios_framework: Option, + #[clap(default_value_t = PluginIosFramework::default())] + pub(crate) ios_framework: PluginIosFramework, } impl From for super::init::Options {