diff --git a/build.sbt b/build.sbt index b0d6d40..4024100 100644 --- a/build.sbt +++ b/build.sbt @@ -49,7 +49,7 @@ git.formattedShaVersion := { // Scala configuration scalaVersion := "3.3.1" -scalacOptions ++= "-release:17 -deprecation -unchecked".split(" ").toSeq +scalacOptions ++= "-release:21 -deprecation -unchecked".split(" ").toSeq crossPaths := false // Dependencies diff --git a/src/main/scala/moe/lymia/mppatch/ui/ConfigurationStore.scala b/src/main/scala/moe/lymia/mppatch/ui/ConfigurationStore.scala new file mode 100644 index 0000000..37e65b6 --- /dev/null +++ b/src/main/scala/moe/lymia/mppatch/ui/ConfigurationStore.scala @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2015-2023 Lymia Kanokawa + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package moe.lymia.mppatch.ui + +import moe.lymia.mppatch.ui.InstallationConfiguration.* +import play.api.libs.json.* +import play.api.libs.json.Reads.* +import play.api.libs.json.Writes.* + +import java.nio.file.{Path, Paths} +import java.util.Locale +import javax.swing.JFrame + +object ConfigurationStore extends LaunchFrameError { + private val prefs = java.util.prefs.Preferences.userNodeForPackage(getClass) + class ConfigKey[T: Reads: Format](val name: String, default: => T) { + def this(name: String) = this(name, sys.error("preference " + name + " not set")) + + protected def encode(v: T): String = Json.stringify(Json.toJson(v)) + protected def decode(s: String): T = Json.fromJson(Json.parse(s)).get + + def hasValue = prefs.get(name, null) != null + def clear() = prefs.remove(name) + def valueOption = try { + val pref = prefs.get(name, null) + if (pref == null) None else Some(decode(pref)) + } catch { + case _: Exception => None + } + def value = valueOption.fold(default)(identity) + def value_=(t: T) = prefs.put(name, encode(t)) + } + private class RawStringConfigKey(name: String) extends ConfigKey[String](name) { + override protected def encode(v: String): String = v + override protected def decode(s: String): String = s + } + + private val configVersion = new ConfigKey[Int]("installer_config_version") + val installationDirs = new ConfigKey[Seq[String]]("installer_v1_installation_dirs", Seq()) + def installationConf(path: Path) = { + val canonical = path.toRealPath().toString + new ConfigKey[InstallationConfiguration](s"installer_v1_conf|$canonical") + } + + val legacyInstallationDirectory: ConfigKey[String] = new RawStringConfigKey("installationDirectory") + val legacyEnableDebug: ConfigKey[Boolean] = new ConfigKey("enableDebug", false) + val legacyEnableLogging: ConfigKey[Boolean] = new ConfigKey("enableLogging", true) + val legacyEnableMultiplayerPatch: ConfigKey[Boolean] = new ConfigKey("enableMultiplayerPatch", true) + val legacyEnableLuaJIT: ConfigKey[Boolean] = new ConfigKey("enableLuaJIT", true) + + private def hasLegacyValues: Boolean = + legacyInstallationDirectory.hasValue || legacyEnableDebug.hasValue || legacyEnableLogging.hasValue || + legacyEnableMultiplayerPatch.hasValue || legacyEnableLuaJIT.hasValue + def updatePreferences(findDefaultDirectory: => Option[Path]): Unit = + if (!configVersion.hasValue && hasLegacyValues) { + configVersion.value = 1 + val defaultDirectory = legacyInstallationDirectory.valueOption match { + case Some(x) => + val realPath = Paths.get(x).toRealPath().toString + installationDirs.value = installationDirs.value :+ realPath + Some(Paths.get(x)) + case None => + val _ = installationDirs.value // make sure the key exists, but don't do anything else + findDefaultDirectory + } + defaultDirectory match { + case Some(defaultDirectory) => + installationConf(defaultDirectory).value = InstallationConfiguration( + enableDebug = legacyEnableDebug.value, + enableLogging = legacyEnableLogging.value, + enableMultiplayerPatch = legacyEnableMultiplayerPatch.value, + enableLuaJit = legacyEnableLuaJIT.value + ) + case _ => + } + } else if (configVersion.hasValue && configVersion.value != 1) { + if (confirmDialog("error.configVersionTooNew")) { + configVersion.value = 1 + } else { + throw new InstallerException("Cancelling configuration downgrade", null) + } + } else { + // do nothing + } +} diff --git a/src/main/scala/moe/lymia/mppatch/ui/InstallationManager.scala b/src/main/scala/moe/lymia/mppatch/ui/InstallationManager.scala index 01885c5..4d8014c 100755 --- a/src/main/scala/moe/lymia/mppatch/ui/InstallationManager.scala +++ b/src/main/scala/moe/lymia/mppatch/ui/InstallationManager.scala @@ -22,6 +22,8 @@ package moe.lymia.mppatch.ui +import play.api.libs.json.{Json, OFormat} + import java.nio.file.Path case class InstallationConfiguration( @@ -30,9 +32,10 @@ case class InstallationConfiguration( enableMultiplayerPatch: Boolean, enableLuaJit: Boolean ) - -class Installation(rootDir: Path) { - +object InstallationConfiguration { + implicit val jsonFormat: OFormat[InstallationConfiguration] = Json.format[InstallationConfiguration] } +class Installation(rootDir: Path) {} + class InstallationManager {} diff --git a/src/main/scala/moe/lymia/mppatch/ui/MPPatchInstaller.scala b/src/main/scala/moe/lymia/mppatch/ui/MPPatchInstaller.scala index 85d0ee6..60aa42d 100644 --- a/src/main/scala/moe/lymia/mppatch/ui/MPPatchInstaller.scala +++ b/src/main/scala/moe/lymia/mppatch/ui/MPPatchInstaller.scala @@ -24,11 +24,13 @@ package moe.lymia.mppatch.ui import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont import com.formdev.flatlaf.{FlatIntelliJLaf, FlatLaf} -import moe.lymia.mppatch.core.PlatformType +import moe.lymia.mppatch.core.{PatchPackage, Platform, PlatformType} +import moe.lymia.mppatch.util.io.ResourceDataSource import moe.lymia.mppatch.util.{Logger, SimpleLogger, VersionInfo} import java.io.{File, FileOutputStream, OutputStreamWriter, PrintWriter} import java.nio.charset.StandardCharsets +import java.nio.file.Path import java.text.DateFormat import java.util.Locale import javax.swing.{JFrame, JOptionPane, UIManager} @@ -141,11 +143,11 @@ object MPPatchInstaller extends LaunchFrameError { // generate native image configs log.warn("Generating native image configs...") log.warn("If you did not intend this, I don't know what to say.") - Preferences.updatePreferences() + ConfigurationStore.updatePreferences(defaultCivilizationPath) NativeImageGenConfig.run() } else { // start main frame - Preferences.updatePreferences() + ConfigurationStore.updatePreferences(defaultCivilizationPath) new MainFrame(locale).showForm() } } catch { @@ -156,4 +158,12 @@ object MPPatchInstaller extends LaunchFrameError { case _: InstallerException => // ignored } } + + private def defaultCivilizationPath: Option[Path] = { + val pkg = new PatchPackage(ResourceDataSource("builtin_patch")) + val platform = Platform(PlatformType.currentPlatform).get + val validPaths = + for (path <- platform.defaultSystemPaths if pkg.detectInstallationPlatform(path).isDefined) yield path + validPaths.headOption + } } diff --git a/src/main/scala/moe/lymia/mppatch/ui/MainFrame.scala b/src/main/scala/moe/lymia/mppatch/ui/MainFrame.scala index e860011..ca545af 100644 --- a/src/main/scala/moe/lymia/mppatch/ui/MainFrame.scala +++ b/src/main/scala/moe/lymia/mppatch/ui/MainFrame.scala @@ -38,10 +38,10 @@ class MainFrame(val locale: Locale) extends FrameBase[JFrame] { protected var currentStatus: JTextField = _ private def packages = { - val logging = if (Preferences.legacyEnableLogging.value) Set("logging") else Set[String]() - val multiplayer = if (Preferences.legacyEnableMultiplayerPatch.value) Set("multiplayer") else Set[String]() - val luajit = if (Preferences.legacyEnableLuaJIT.value) Set("luajit") else Set[String]() - val debug = if (Preferences.legacyEnableDebug.value) Set("debug") else Set[String]() + val logging = if (ConfigurationStore.legacyEnableLogging.value) Set("logging") else Set[String]() + val multiplayer = if (ConfigurationStore.legacyEnableMultiplayerPatch.value) Set("multiplayer") else Set[String]() + val luajit = if (ConfigurationStore.legacyEnableLuaJIT.value) Set("luajit") else Set[String]() + val debug = if (ConfigurationStore.legacyEnableDebug.value) Set("debug") else Set[String]() debug ++ multiplayer ++ luajit ++ logging } @@ -71,7 +71,7 @@ class MainFrame(val locale: Locale) extends FrameBase[JFrame] { installer.foreach(_.releaseLock()) if (isValid) { instance.acquireLock() - if (changeByUser) Preferences.legacyInstallationDirectory.value = path.toFile.toString + if (changeByUser) ConfigurationStore.legacyInstallationDirectory.value = path.toFile.toString } installer = Some(instance) } else { @@ -94,11 +94,11 @@ class MainFrame(val locale: Locale) extends FrameBase[JFrame] { case Some(x) => changeInstaller(x, false) case None => } - if (Preferences.legacyInstallationDirectory.hasValue) { - val configPath = Paths.get(Preferences.legacyInstallationDirectory.value) + if (ConfigurationStore.legacyInstallationDirectory.hasValue) { + val configPath = Paths.get(ConfigurationStore.legacyInstallationDirectory.value) if (checkPath(configPath)) changeInstaller(configPath, false) else { - Preferences.legacyInstallationDirectory.clear() + ConfigurationStore.legacyInstallationDirectory.clear() pathFromRegistry() } } else pathFromRegistry() diff --git a/src/main/scala/moe/lymia/mppatch/ui/Preferences.scala b/src/main/scala/moe/lymia/mppatch/ui/Preferences.scala deleted file mode 100644 index 742ba07..0000000 --- a/src/main/scala/moe/lymia/mppatch/ui/Preferences.scala +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2015-2023 Lymia Kanokawa - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package moe.lymia.mppatch.ui - -import java.util.Locale -import javax.swing.JFrame - -object Preferences extends LaunchFrameError { - trait PreferenceSerializer[T] { - def encode(t: T): String - def decode(s: String): T - } - case class SimplePreferenceSerializer[T](encodeF: T => String, decodeF: String => T) extends PreferenceSerializer[T] { - def encode(t: T): String = encodeF(t) - def decode(s: String): T = decodeF(s) - } - - private implicit val StringPreference: SimplePreferenceSerializer[String] = - SimplePreferenceSerializer[String](identity, identity) - private implicit val BooleanPreference: SimplePreferenceSerializer[Boolean] = - SimplePreferenceSerializer[Boolean](_.toString, _.toBoolean) - private implicit val IntPreference: SimplePreferenceSerializer[Int] = - SimplePreferenceSerializer[Int](_.toString, _.toInt) - - private case class SeqPreferenceImpl[T: PreferenceSerializer]() extends PreferenceSerializer[Seq[T]] { - override def encode(t: Seq[T]): String = - t.map(x => implicitly[PreferenceSerializer[T]].encode(x).replace("|", "|X").replace("_", "__").replace("|", "_")) - .mkString("|") - override def decode(s: String): Seq[T] = s - .split("\\|") - .toSeq - .map(x => x.replace("_X", "|").replace("__", "_")) - .map(x => implicitly[PreferenceSerializer[T]].decode(x)) - } - private implicit def SeqPreference[T](implicit root: PreferenceSerializer[T]): SeqPreferenceImpl[T] = - SeqPreferenceImpl() - - private val prefs = java.util.prefs.Preferences.userNodeForPackage(getClass) - class PreferenceKey[T: PreferenceSerializer](val name: String, default: => T) { - def this(name: String) = this(name, sys.error("preference " + name + " not set")) - - private val encoder = implicitly[PreferenceSerializer[T]] - - def hasValue = prefs.get(name, null) != null - def clear() = prefs.remove(name) - def valueOption = try { - val pref = prefs.get(name, null) - if (pref == null) None else Some(encoder.decode(pref)) - } catch { - case _: Exception => None - } - def value = valueOption.fold(default)(identity) - def value_=(t: T) = prefs.put(name, encoder.encode(t)) - } - - private val preferencesVersion = new PreferenceKey[Int]("preferenceVersion") - val installationDirs = new PreferenceKey[Seq[String]]("installationDirs") - - val legacyInstallationDirectory = new PreferenceKey[String]("installationDirectory") - val legacyEnableDebug = new PreferenceKey[Boolean]("enableDebug", false) - val legacyEnableLogging = new PreferenceKey[Boolean]("enableLogging", true) - val legacyEnableMultiplayerPatch = new PreferenceKey[Boolean]("enableMultiplayerPatch", true) - val legacyEnableLuaJIT = new PreferenceKey[Boolean]("enableLuaJIT", true) - - private def hasLegacyValues: Boolean = - legacyInstallationDirectory.hasValue || legacyEnableDebug.hasValue || legacyEnableLogging.hasValue || - legacyEnableMultiplayerPatch.hasValue || legacyEnableLuaJIT.hasValue - def updatePreferences(): Unit = - if (!preferencesVersion.hasValue && hasLegacyValues) { - preferencesVersion.value = 1 - } else if (preferencesVersion.hasValue && preferencesVersion.value != 1) { - if (confirmDialog("error.configVersionTooNew")) { - preferencesVersion.value = 1 - } else { - throw new InstallerException("Cancelling configuration downgrade", null) - } - } else { - // do nothing - } -} diff --git a/src/main/scala/moe/lymia/mppatch/ui/SettingsDialog.scala b/src/main/scala/moe/lymia/mppatch/ui/SettingsDialog.scala index 8f6c743..dd7a3c1 100644 --- a/src/main/scala/moe/lymia/mppatch/ui/SettingsDialog.scala +++ b/src/main/scala/moe/lymia/mppatch/ui/SettingsDialog.scala @@ -46,10 +46,10 @@ class SettingsDialog(val locale: Locale, main: MainFrame) extends FrameBase[JDia private def applySettings(): Unit = { main.changeInstaller(Paths.get(installPath.getText)) - Preferences.legacyEnableDebug.value = enableDebug.isSelected - Preferences.legacyEnableLogging.value = enableLogging.isSelected - Preferences.legacyEnableMultiplayerPatch.value = enableMultiplayerPatch.isSelected - Preferences.legacyEnableLuaJIT.value = enableLuaJIT.isSelected + ConfigurationStore.legacyEnableDebug.value = enableDebug.isSelected + ConfigurationStore.legacyEnableLogging.value = enableLogging.isSelected + ConfigurationStore.legacyEnableMultiplayerPatch.value = enableMultiplayerPatch.isSelected + ConfigurationStore.legacyEnableLuaJIT.value = enableLuaJIT.isSelected main.update() } @@ -79,16 +79,16 @@ class SettingsDialog(val locale: Locale, main: MainFrame) extends FrameBase[JDia } enableLogging = options.gridCheckRow(1, "logging") - enableLogging.setSelected(Preferences.legacyEnableLogging.value) + enableLogging.setSelected(ConfigurationStore.legacyEnableLogging.value) enableMultiplayerPatch = options.gridCheckRow(2, "modding") - enableMultiplayerPatch.setSelected(Preferences.legacyEnableMultiplayerPatch.value) + enableMultiplayerPatch.setSelected(ConfigurationStore.legacyEnableMultiplayerPatch.value) enableLuaJIT = options.gridCheckRow(3, "luajit") - enableLuaJIT.setSelected(Preferences.legacyEnableLuaJIT.value) + enableLuaJIT.setSelected(ConfigurationStore.legacyEnableLuaJIT.value) enableDebug = options.gridCheckRow(4, "debug") - enableDebug.setSelected(Preferences.legacyEnableDebug.value) + enableDebug.setSelected(ConfigurationStore.legacyEnableDebug.value) } frame.add( diff --git a/src/patch/mppatch-core/.cargo/config b/src/patch/mppatch-core/.cargo/config new file mode 100644 index 0000000..913edd9 --- /dev/null +++ b/src/patch/mppatch-core/.cargo/config @@ -0,0 +1,4 @@ +[target.i686-pc-windows-gnu] +linker = "i686-w64-mingw32-gcc" +ar = "i686-w64-mingw32-gcc-ar" + diff --git a/src/patch/mppatch-core/Cargo.lock b/src/patch/mppatch-core/Cargo.lock index 79b69cb..b490eb9 100644 --- a/src/patch/mppatch-core/Cargo.lock +++ b/src/patch/mppatch-core/Cargo.lock @@ -48,9 +48,9 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ - "proc-macro2 1.0.69", + "proc-macro2 1.0.70", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -70,12 +70,12 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "ctor" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e366bff8cd32dd8754b0991fb66b279dc48f598c3a18914852a6673deef583" +checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" dependencies = [ "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -96,9 +96,9 @@ checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.69", + "proc-macro2 1.0.70", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -109,14 +109,14 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" dependencies = [ "powerfmt", ] @@ -161,9 +161,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" dependencies = [ "darling", - "proc-macro2 1.0.69", + "proc-macro2 1.0.70", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -180,9 +180,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "ident_case" @@ -202,9 +202,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "lazy_static" @@ -214,9 +214,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] name = "log" @@ -261,9 +261,9 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f359220f24e6452dd82a3f50d7242d4aab822b5594798048e953d7a9e0314c6" dependencies = [ - "proc-macro2 1.0.69", + "proc-macro2 1.0.70", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -312,9 +312,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "paris" @@ -345,9 +345,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -367,7 +367,7 @@ version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ - "proc-macro2 1.0.69", + "proc-macro2 1.0.70", ] [[package]] @@ -391,9 +391,9 @@ version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ - "proc-macro2 1.0.69", + "proc-macro2 1.0.70", "quote 1.0.33", - "syn 2.0.39", + "syn 2.0.41", ] [[package]] @@ -430,11 +430,11 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" dependencies = [ - "proc-macro2 1.0.69", + "proc-macro2 1.0.70", "quote 1.0.33", "unicode-ident", ] @@ -558,9 +558,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2" dependencies = [ "memchr", ]