[WIP] Refactor(Crates) Tauri into individual Crates (#192)

* split tauri into 3 crates

* fix macros

* change builder into lib

* cleanup package paths

* add features back to lib

* make build function public

* add build-deps

* rename and fix.

* correct package name

* move crates to root and refactor names

* fix github action

* move fixture to tauri-build

* remove slash

* add .vscode features

* fix updater

* fix updater mistake

* fix(tauri) refactor buiilds

* fix seperation

* change get back to get

* fix cfg and remove dead code warnings.

* roll #160 into this pr

* add credit

* fix eof

* chore(tauri) move assets to mod, loadAssets cfg outside its definition

* chore(tauri) remove unused deps

* update updater and cfg

* fix(tauri) embedded-server with dead variable

* add review refactors and remove cli form workgroup

* chore(tauri) rename tauri to tauri-api and tauri-bundle to tauri

* fix workspace and updater

* rename update to updater
This commit is contained in:
Tensor-Programming 2019-12-22 14:04:45 -05:00 committed by GitHub
parent 7bd0c2f06d
commit e288180104
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 324 additions and 989 deletions

778
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
[workspace]
members = [
"tauri",
"cli/tauri-cli"
"tauri-api",
"tauri-updater",
]

View File

@ -1,7 +1,7 @@
[package]
name = "tauri-cli"
version = "0.1.2"
authors = ["George Burton <burtonageo@gmail.com>", "Lucas Fernandes Gonçalves Nogueira <lucas@quasar.dev>", "Daniel Thompson-Yvetot <denjell@sfosc.org>"]
authors = ["George Burton <burtonageo@gmail.com>", "Lucas Fernandes Gonçalves Nogueira <lucas@quasar.dev>", "Daniel Thompson-Yvetot <denjell@sfosc.org>", "Tensor Programming <tensordeveloper@gmail.com>"]
license = "MIT/Apache-2.0"
keywords = ["bundle", "cargo", "tauri"]
repository = "https://github.com/tauri-apps/tauri"
@ -31,12 +31,14 @@ toml = "0.5.5"
uuid = { version = "0.8", features = ["v5"] }
walkdir = "2"
sha2 = "0.8"
lazy_static = "1.4"
handlebars = "2.0"
attohttpc = "0.7.0"
hex = "0.4"
zip = "0.5"
attohttpc = { version = "0.7.0" }
[target.'cfg(not(target_os = "linux"))'.dependencies]
handlebars = { version = "2.0" }
lazy_static = { version = "1.4" }
zip = { version = "0.5" }
sha2 = { version = "0.8" }
hex = { version = "0.4" }
[dev-dependencies]
tempfile = "3"
@ -44,3 +46,8 @@ tempfile = "3"
[[bin]]
name = "cargo-tauri-cli"
path = "src/main.rs"
[features]
appimage = []
ios = []
dmg = []

View File

@ -1,14 +1,19 @@
#[cfg(feature = "appimage")]
mod appimage_bundle;
mod category;
mod common;
mod deb_bundle;
#[cfg(feature = "dmg")]
mod dmg_bundle;
#[cfg(feature = "ios")]
mod ios_bundle;
#[cfg(target_os = "windows")]
mod msi_bundle;
mod osx_bundle;
mod path_utils;
mod rpm_bundle;
mod settings;
#[cfg(target_os = "windows")]
mod wix;
pub use self::common::{print_error, print_finished};
@ -20,15 +25,19 @@ pub fn bundle_project(settings: Settings) -> crate::Result<Vec<PathBuf>> {
for package_type in settings.package_types()? {
paths.append(&mut match package_type {
PackageType::OsxBundle => osx_bundle::bundle_project(&settings)?,
#[cfg(feature = "ios")]
PackageType::IosBundle => ios_bundle::bundle_project(&settings)?,
// use dmg bundler
// PackageType::OsxBundle => dmg_bundle::bundle_project(&settings)?,
#[cfg(target_os = "windows")]
PackageType::WindowsMsi => msi_bundle::bundle_project(&settings)?,
// force appimage on linux
// PackageType::Deb => appimage_bundle::bundle_project(&settings)?,
PackageType::Deb => deb_bundle::bundle_project(&settings)?,
PackageType::Rpm => rpm_bundle::bundle_project(&settings)?,
#[cfg(feature = "appimage")]
PackageType::AppImage => appimage_bundle::bundle_project(&settings)?,
#[cfg(feature = "dmg")]
PackageType::Dmg => dmg_bundle::bundle_project(&settings)?,
});
}

View File

@ -13,11 +13,15 @@ use walkdir;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum PackageType {
OsxBundle,
#[cfg(feature = "ios")]
IosBundle,
#[cfg(target_os = "windows")]
WindowsMsi,
Deb,
Rpm,
#[cfg(feature = "appimage")]
AppImage,
#[cfg(feature = "dmg")]
Dmg,
}
@ -26,11 +30,15 @@ impl PackageType {
// Other types we may eventually want to support: apk
match name {
"deb" => Some(PackageType::Deb),
#[cfg(feature = "ios")]
"ios" => Some(PackageType::IosBundle),
#[cfg(target_os = "windows")]
"msi" => Some(PackageType::WindowsMsi),
"osx" => Some(PackageType::OsxBundle),
"rpm" => Some(PackageType::Rpm),
#[cfg(feature = "appimage")]
"appimage" => Some(PackageType::AppImage),
#[cfg(feature = "dmg")]
"dmg" => Some(PackageType::Dmg),
_ => None,
}
@ -39,11 +47,15 @@ impl PackageType {
pub fn short_name(&self) -> &'static str {
match *self {
PackageType::Deb => "deb",
#[cfg(feature = "ios")]
PackageType::IosBundle => "ios",
#[cfg(target_os = "windows")]
PackageType::WindowsMsi => "msi",
PackageType::OsxBundle => "osx",
PackageType::Rpm => "rpm",
#[cfg(feature = "appimage")]
PackageType::AppImage => "appimage",
#[cfg(feature = "dmg")]
PackageType::Dmg => "dmg",
}
}
@ -55,7 +67,9 @@ impl PackageType {
const ALL_PACKAGE_TYPES: &[PackageType] = &[
PackageType::Deb,
#[cfg(feature = "ios")]
PackageType::IosBundle,
#[cfg(target_os = "windows")]
PackageType::WindowsMsi,
PackageType::OsxBundle,
PackageType::Rpm,
@ -328,8 +342,10 @@ impl Settings {
};
match target_os {
"macos" => Ok(vec![PackageType::OsxBundle]),
#[cfg(feature = "ios")]
"ios" => Ok(vec![PackageType::IosBundle]),
"linux" => Ok(vec![PackageType::Deb]), // TODO: Do Rpm too, once it's implemented.
#[cfg(target_os = "windows")]
"windows" => Ok(vec![PackageType::WindowsMsi]),
os => bail!("Native {} bundles not yet supported.", os),
}

View File

@ -27,10 +27,7 @@ serde_derive = "1.0"
tiny_http = "0.6"
phf = "0.8.0"
includedir = "0.5.0"
[dependencies.tauri]
path = "../../../../tauri"
features = [ "all-api", "edge" ]
tauri = { path = "../../../../tauri", features = [ "all-api", "edge" ] }
[features]
dev-server = [ "tauri/dev-server" ]

View File

@ -10,7 +10,7 @@ module.exports = function () {
ctx: {},
tauri: {
embeddedServer: {
active: false
active: true
},
bundle: {
active: true

22
tauri-api/Cargo.toml Normal file
View File

@ -0,0 +1,22 @@
[package]
name = "tauri-api"
version = "0.2.0"
authors = ["Lucas Fernandes Gonçalves Nogueira <lucas@quasar.dev>", "Daniel Thompson-Yvetot <denjell@sfosc.org>", "Tensor Programming <tensordeveloper@gmail.com>"]
license = "MIT"
homepage = "https://tauri-apps.org"
repository = "https://github.com/tauri-apps/tauri"
description = "Make tiny, secure apps for all desktop platforms with Tauri"
edition = "2018"
exclude = ["test/fixture/**"]
[dependencies]
serde = { version = "1.0", features = ["derive"] }
dirs = "2.0.2"
ignore = "0.4.10"
zip = "0.5.3"
tempdir = "0.3"
semver = "0.9"
tempfile = "3"
either = "1.5.3"
tar = "0.4"
flate2 = "1"

23
tauri/src/command.rs → tauri-api/src/command.rs Executable file → Normal file
View File

@ -1,9 +1,5 @@
use web_view::WebView;
use std::process::{Child, Command, Stdio};
use crate::execute_promise;
pub fn get_output(cmd: String, args: Vec<String>, stdout: Stdio) -> Result<String, String> {
Command::new(cmd)
.args(args)
@ -57,22 +53,3 @@ pub fn spawn_relative_command(
let cmd = relative_command(command)?;
Ok(Command::new(cmd).args(args).stdout(stdout).spawn()?)
}
pub fn call<T: 'static>(
webview: &mut WebView<'_, T>,
command: String,
args: Vec<String>,
callback: String,
error: String,
) {
execute_promise(
webview,
|| {
get_output(command, args, Stdio::piped())
.map_err(|err| format!("`{}`", err))
.map(|output| format!("`{}`", output))
},
callback,
error,
);
}

View File

@ -2,6 +2,7 @@ use tempfile;
mod utils;
use ignore::Walk;
use serde::Serialize;
use std::fs;
use std::fs::metadata;
use utils::get_dir_name_from_path;

0
tauri/src/dir/utils.rs → tauri-api/src/dir/utils.rs Executable file → Normal file
View File

6
tauri-api/src/lib.rs Normal file
View File

@ -0,0 +1,6 @@
pub mod command;
pub mod dir;
pub mod file;
pub mod rpc;
pub mod version;

0
tauri/src/rpc.rs → tauri-api/src/rpc.rs Executable file → Normal file
View File

22
tauri-updater/Cargo.toml Normal file
View File

@ -0,0 +1,22 @@
[package]
name = "tauri-updater"
version = "0.2.0"
authors = ["Lucas Fernandes Gonçalves Nogueira <lucas@quasar.dev>", "Daniel Thompson-Yvetot <denjell@sfosc.org>", "Tensor Programming <tensordeveloper@gmail.com>"]
license = "MIT"
homepage = "https://tauri-apps.org"
repository = "https://github.com/tauri-apps/tauri"
description = "Updater for Tauri"
edition = "2018"
exclude = ["test/fixture/**"]
[dependencies]
reqwest = "0.9"
hyper-old-types = "0.11.0"
pbr = "1"
serde_json = "1.0.44"
serde = "1.0"
zip = "0.5.3"
sysinfo = "0.10"
tempdir = "0.3"
tauri-api = { version = "0.2", path = "../tauri-api" }

7
tauri-updater/src/lib.rs Normal file
View File

@ -0,0 +1,7 @@
#[macro_use]
pub mod macros;
pub mod http;
pub mod platform;
pub mod process;
pub mod updater;

View File

@ -2,8 +2,8 @@ use std::env;
use std::fs;
use std::path::PathBuf;
use crate::file::{Extract, Move};
use crate::http;
use tauri_api::file::{Extract, Move};
pub mod github;
@ -129,7 +129,7 @@ impl UpdateBuilder {
///
/// ```
/// # use tauri::updater::Update;
/// # fn run() -> Result<(), Box<::std::error::Error>> {
/// # fn run() -> Result<(), Box<dyn std::error::Error>> {
/// Update::configure()?
/// .bin_path_in_archive("bin/myapp")
/// # .build()?;

View File

@ -1,8 +1,8 @@
use crate::file;
use crate::http;
use crate::version;
use reqwest;
use std;
use tauri_api::file;
use tauri_api::version;
use zip::result::ZipError;
#[derive(Debug)]

View File

@ -1,7 +1,7 @@
[package]
name = "tauri"
version = "0.2.0"
authors = ["Lucas Fernandes Gonçalves Nogueira <lucas@quasar.dev>", "Daniel Thompson-Yvetot <denjell@sfosc.org>"]
authors = ["Lucas Fernandes Gonçalves Nogueira <lucas@quasar.dev>", "Daniel Thompson-Yvetot <denjell@sfosc.org>", "Tensor Programming <tensordeveloper@gmail.com>"]
license = "MIT"
homepage = "https://tauri-apps.org"
repository = "https://github.com/tauri-apps/tauri"
@ -10,40 +10,26 @@ edition = "2018"
exclude = ["test/fixture/**"]
[dependencies]
web-view = "0.5.4"
serde_json = "1.0.44"
serde = "1.0"
serde_derive = "1.0"
dirs = "2.0.2"
ignore = "0.4.10"
phf = "0.8.0"
threadpool = "1.7"
rand = "0.7"
zip = "0.5.3"
tempdir = "0.3"
semver = "0.9"
tempfile = "3"
either = "1.5.3"
tar = "0.4"
flate2 = "1"
sysinfo = "0.10"
webbrowser = "0.5.2"
uuid = { version = "0.8.1", features = ["v4"] }
lazy_static = "1.4.0"
web-view = "0.5.4"
tauri_includedir = "0.5.0"
tiny_http = "0.6"
phf = "0.8.0"
base64 = "0.11.0"
reqwest = {version = "0.9", optional = true }
hyper-old-types = {version = "0.11.0", optional = true }
pbr = {version = "1", optional = true }
webbrowser = "0.5.2"
lazy_static = "1.4.0"
tiny_http = "0.6"
threadpool = "1.7"
uuid = { version = "0.8.1", features = ["v4"] }
tauri-api = { version = "0.2", path = "../tauri-api" }
[build-dependencies]
tauri_includedir_codegen = "0.5.1"
serde_json = "1.0.44"
serde = "1.0"
serde_derive = "1.0"
rand = "0.7"
[features]
edge = ["web-view/edge"]
@ -60,4 +46,3 @@ setTitle = []
execute = []
open = []
emit = []
updater = []

87
tauri/build.rs Executable file → Normal file
View File

@ -1,90 +1,29 @@
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
use std::env;
use std::io::Write;
#[path = "src/config.rs"]
mod config;
#[cfg(not(feature = "dev-server"))]
extern crate tauri_includedir_codegen;
#[cfg(feature = "embedded-server")]
mod tcp;
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let dest_path = std::path::Path::new(&out_dir).join("tauri_src");
let mut file = std::fs::File::create(&dest_path).unwrap();
#[cfg(not(feature = "dev-server"))]
#[macro_use]
extern crate serde_derive;
#[cfg(not(feature = "dev-server"))]
extern crate serde_json;
let tauri_src: String;
let config = config::get();
#[cfg(not(any(feature = "embedded-server", feature = "no-server")))]
{
tauri_src = if config.dev_path.starts_with("http") {
config.dev_path
} else {
let dev_path = std::path::Path::new(&config.dev_path).join("index.tauri.html");
println!("{}", format!("cargo:rerun-if-changed={:?}", dev_path));
std::fs::read_to_string(dev_path).unwrap()
};
}
#[cfg(not(feature = "dev-server"))]
#[path = "src/config.rs"]
mod config;
pub fn main() {
#[cfg(not(feature = "dev-server"))]
{
match env::var("TAURI_DIST_DIR") {
match std::env::var("TAURI_DIST_DIR") {
Ok(dist_path) => {
let config = config::get();
// include assets
tauri_includedir_codegen::start("ASSETS")
.dir(dist_path, tauri_includedir_codegen::Compression::None)
.build("data.rs", config.inlined_assets)
.unwrap()
.expect("failed to build data.rs")
}
Err(_e) => panic!("Build error: Couldn't find ENV: {}", _e),
Err(e) => panic!("Build error: Couldn't find ENV: {}", e),
}
}
#[cfg(feature = "embedded-server")]
{
// define URL
let port;
let port_valid;
if config.embedded_server.port == "random" {
match tcp::get_available_port() {
Some(available_port) => {
port = available_port.to_string();
port_valid = true;
}
None => {
port = "0".to_string();
port_valid = false;
}
}
} else {
port = config.embedded_server.port;
port_valid = crate::tcp::port_is_available(
port
.parse::<u16>()
.expect(&format!("Invalid port {}", port)),
);
}
if port_valid {
let mut url = format!("{}:{}", config.embedded_server.host, port);
if !url.starts_with("http") {
url = format!("http://{}", url);
}
tauri_src = url.to_string();
} else {
panic!(format!("Port {} is not valid or not open", port));
}
}
#[cfg(feature = "no-server")]
{
let index_path = std::path::Path::new(env!("TAURI_DIST_DIR")).join("index.tauri.html");
println!("{}", format!("cargo:rerun-if-changed={:?}", index_path));
tauri_src = std::fs::read_to_string(index_path).unwrap();
}
file.write_all(tauri_src.as_bytes()).unwrap();
}

View File

@ -1,12 +1,65 @@
pub(crate) fn run(application: &mut crate::App) {
let debug = cfg!(debug_assertions);
let config = crate::config::get();
let tauri_src = include_str!(concat!(env!("OUT_DIR"), "/tauri_src"));
let content = if tauri_src.starts_with("http://") || tauri_src.starts_with("https://") {
web_view::Content::Url(tauri_src)
} else {
web_view::Content::Html(tauri_src)
};
let content;
#[cfg(not(any(feature = "embedded-server", feature = "no-server")))]
{
content = if config.dev_path.starts_with("http") {
web_view::Content::Url(config.dev_path)
} else {
let dev_path = std::path::Path::new(&config.dev_path).join("index.tauri.html");
web_view::Content::Html(
std::fs::read_to_string(dev_path).expect("failed to build index.tauri.html"),
)
};
}
#[cfg(feature = "embedded-server")]
let server_url;
#[cfg(feature = "embedded-server")]
{
// define URL
let port;
let port_valid;
if config.embedded_server.port == "random" {
match crate::tcp::get_available_port() {
Some(available_port) => {
port = available_port.to_string();
port_valid = true;
}
None => {
port = "0".to_string();
port_valid = false;
}
}
} else {
port = config.embedded_server.port;
port_valid = crate::tcp::port_is_available(
port
.parse::<u16>()
.expect(&format!("Invalid port {}", port)),
);
}
if port_valid {
let mut url = format!("{}:{}", config.embedded_server.host, port);
if !url.starts_with("http") {
url = format!("http://{}", url);
}
server_url = url.clone();
content = web_view::Content::Url(url.to_string());
} else {
panic!(format!("Port {} is not valid or not open", port));
}
}
#[cfg(feature = "no-server")]
{
let index_path = std::path::Path::new(env!("TAURI_DIST_DIR")).join("index.tauri.html");
content =
web_view::Content::Html(std::fs::read_to_string(index_path).expect("failed to read string"));
}
#[cfg(feature = "updater")]
{
@ -29,7 +82,7 @@ pub(crate) fn run(application: &mut crate::App) {
.debug(debug)
.user_data(())
.invoke_handler(|webview, arg| {
if !crate::api::handler(webview, arg) {
if !crate::endpoints::handle(webview, arg) {
application.run_invoke_handler(webview, arg);
}
// the first command is always the `init`, so we can safely run the setup hook here
@ -45,30 +98,30 @@ pub(crate) fn run(application: &mut crate::App) {
.unwrap();
#[cfg(feature = "dev-server")]
webview.handle()
.dispatch(|_webview| {
_webview.eval(include_str!(concat!(env!("TAURI_DIR"), "/tauri.js")))
})
webview
.handle()
.dispatch(|_webview| _webview.eval(include_str!(concat!(env!("TAURI_DIR"), "/tauri.js"))))
.unwrap();
#[cfg(feature = "embedded-server")]
{
std::thread::spawn(move || {
let server = tiny_http::Server::http(
tauri_src
server_url
.clone()
.replace("http://", "")
.replace("https://", ""),
)
.expect(&format!(
"Could not start embedded server with the specified url: {}",
tauri_src
server_url
));
for request in server.incoming_requests() {
let mut url = request.url().to_string();
if url == "/" {
url = "/index.tauri.html".to_string();
let url = match request.url() {
"/" => "/index.tauri.html",
url => url,
}
.to_string();
request
.respond(crate::server::asset_response(&url))
.unwrap();

1
tauri/src/assets.rs Normal file
View File

@ -0,0 +1 @@
include!(concat!(env!("OUT_DIR"), "/data.rs"));

View File

@ -84,5 +84,6 @@ fn default_dev_path() -> String {
}
pub fn get() -> Config {
serde_json::from_str(include_str!(concat!(env!("TAURI_DIR"), "/config.json"))).unwrap()
serde_json::from_str(include_str!(concat!(env!("TAURI_DIR"), "/config.json")))
.expect("failed to create config.json")
}

View File

@ -2,11 +2,8 @@ mod cmd;
use web_view::WebView;
#[cfg(not(any(feature = "dev-server", feature = "embedded-server")))]
include!(concat!(env!("OUT_DIR"), "/data.rs"));
#[allow(unused_variables)]
pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
pub(crate) fn handle<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
use cmd::Cmd::*;
match serde_json::from_str(arg) {
Err(_) => false,
@ -56,7 +53,7 @@ pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
callback,
error,
} => {
super::file_system::read_text_file(webview, path, callback, error);
crate::file_system::read_text_file(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "readBinaryFile"))]
ReadBinaryFile {
@ -64,7 +61,7 @@ pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
callback,
error,
} => {
super::file_system::read_binary_file(webview, path, callback, error);
crate::file_system::read_binary_file(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "writeFile"))]
WriteFile {
@ -73,7 +70,7 @@ pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
callback,
error,
} => {
super::file_system::write_file(webview, file, contents, callback, error);
crate::file_system::write_file(webview, file, contents, callback, error);
}
#[cfg(any(feature = "all-api", feature = "listDirs"))]
ListDirs {
@ -81,7 +78,7 @@ pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
callback,
error,
} => {
super::file_system::list_dirs(webview, path, callback, error);
crate::file_system::list_dirs(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "listFiles"))]
ListFiles {
@ -89,7 +86,7 @@ pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
callback,
error,
} => {
super::file_system::list(webview, path, callback, error);
crate::file_system::list(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "setTitle"))]
SetTitle { title } => {
@ -102,11 +99,11 @@ pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
callback,
error,
} => {
super::command::call(webview, command, args, callback, error);
crate::call(webview, command, args, callback, error);
}
#[cfg(any(feature = "all-api", feature = "open"))]
Open { uri } => {
super::spawn(move || {
crate::spawn(move || {
webbrowser::open(&uri).unwrap();
});
}
@ -155,45 +152,53 @@ pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
Emit { event, payload } => {
crate::event::on_event(event, payload);
}
#[cfg(not(any(feature = "dev-server", feature = "embedded-server")))]
LoadAsset {
asset,
asset_type,
callback,
error,
} => {
#[cfg(not(any(feature = "dev-server", feature = "embedded-server")))]
{
let handle = webview.handle();
crate::execute_promise(
webview,
move || {
let read_asset = ASSETS.get(&format!("{}{}{}", env!("TAURI_DIST_DIR"), if asset.starts_with("/") { "" } else { "/" }, asset));
if read_asset.is_err() {
return Err(r#""Asset not found""#.to_string());
}
let handle = webview.handle();
crate::execute_promise(
webview,
move || {
let read_asset = crate::assets::ASSETS.get(&format!(
"{}{}{}",
env!("TAURI_DIST_DIR"),
if asset.starts_with("/") { "" } else { "/" },
asset
));
if read_asset.is_err() {
return Err(r#""Asset not found""#.to_string());
}
if asset_type == "image" {
let ext = if asset.ends_with("gif") {
"gif"
} else if asset.ends_with("png") {
"png"
} else {
"jpeg"
};
Ok(format!("`data:image/{};base64,{}`", ext, base64::encode(&read_asset.unwrap().into_owned())))
if asset_type == "image" {
let ext = if asset.ends_with("gif") {
"gif"
} else if asset.ends_with("png") {
"png"
} else {
handle
.dispatch(move |_webview| {
_webview.eval(&std::str::from_utf8(&read_asset.unwrap().into_owned()).unwrap())
})
.map_err(|err| format!("`{}`", err))
.map(|_| r#""Asset loaded successfully""#.to_string())
}
},
callback,
error,
);
}
"jpeg"
};
Ok(format!(
"`data:image/{};base64,{}`",
ext,
base64::encode(&read_asset.unwrap().into_owned())
))
} else {
handle
.dispatch(move |_webview| {
_webview
.eval(&std::str::from_utf8(&read_asset.unwrap().into_owned()).unwrap())
})
.map_err(|err| format!("`{}`", err))
.map(|_| r#""Asset loaded successfully""#.to_string())
}
},
callback,
error,
);
}
}
true

View File

@ -63,6 +63,7 @@ pub enum Cmd {
event: String,
payload: String,
},
#[cfg(not(any(feature = "dev-server", feature = "embedded-server")))]
LoadAsset {
asset: String,
asset_type: String,

15
tauri/src/file_system.rs Executable file → Normal file
View File

@ -1,8 +1,7 @@
use web_view::WebView;
use crate::dir;
use crate::execute_promise;
use crate::file;
use tauri_api::dir;
use tauri_api::file;
use std::fs::File;
use std::io::Write;
@ -13,7 +12,7 @@ pub fn list<T: 'static>(
callback: String,
error: String,
) {
execute_promise(
crate::execute_promise(
webview,
move || {
dir::walk_dir(path.to_string())
@ -30,7 +29,7 @@ pub fn list_dirs<T: 'static>(
callback: String,
error: String,
) {
execute_promise(
crate::execute_promise(
webview,
move || {
dir::list_dir_contents(&path)
@ -48,7 +47,7 @@ pub fn write_file<T: 'static>(
callback: String,
error: String,
) {
execute_promise(
crate::execute_promise(
webview,
move || {
File::create(file)
@ -70,7 +69,7 @@ pub fn read_text_file<T: 'static>(
callback: String,
error: String,
) {
execute_promise(
crate::execute_promise(
webview,
move || {
file::read_string(path).and_then(|f| {
@ -90,7 +89,7 @@ pub fn read_binary_file<T: 'static>(
callback: String,
error: String,
) {
execute_promise(
crate::execute_promise(
webview,
move || {
file::read_binary(path).and_then(|f| {

View File

@ -1,65 +1,81 @@
#[macro_use]
extern crate serde_derive;
#[cfg(feature = "updater")]
#[macro_use]
mod macros;
extern crate serde_json;
#[macro_use]
extern crate lazy_static;
extern crate web_view;
pub mod api;
mod app;
pub mod command;
mod endpoints;
pub mod config;
pub mod dir;
pub mod event;
pub mod file;
pub mod file_system;
#[cfg(feature = "updater")]
pub mod http;
#[cfg(feature = "updater")]
pub mod platform;
pub mod process;
pub mod rpc;
pub mod salt;
#[cfg(feature = "embedded-server")]
pub mod server;
#[cfg(feature = "updater")]
pub mod updater;
pub mod version;
pub use app::*;
#[allow(dead_code)]
mod file_system;
#[allow(dead_code)]
mod salt;
use web_view::*;
#[cfg(feature = "embedded-server")]
mod tcp;
#[cfg(not(feature = "dev-server"))]
pub mod assets;
mod app;
use std::process::Stdio;
use threadpool::ThreadPool;
pub use app::*;
use web_view::*;
pub use tauri_api as api;
thread_local!(static POOL: ThreadPool = ThreadPool::new(4));
pub fn spawn<F: FnOnce() -> () + Send + 'static>(what: F) {
pub fn spawn<F: FnOnce() -> () + Send + 'static>(task: F) {
POOL.with(|thread| {
thread.execute(move || {
what();
task();
});
});
}
pub fn execute_promise<T: 'static, F: FnOnce() -> Result<String, String> + Send + 'static>(
webview: &mut WebView<'_, T>,
what: F,
task: F,
callback: String,
error: String,
) {
let handle = webview.handle();
POOL.with(|thread| {
thread.execute(move || {
let callback_string = rpc::format_callback_result(what(), callback, error);
let callback_string = api::rpc::format_callback_result(task(), callback, error);
handle
.dispatch(move |_webview| _webview.eval(callback_string.as_str()))
.unwrap()
});
});
}
pub fn call<T: 'static>(
webview: &mut WebView<'_, T>,
command: String,
args: Vec<String>,
callback: String,
error: String,
) {
execute_promise(
webview,
|| {
api::command::get_output(command, args, Stdio::piped())
.map_err(|err| format!("`{}`", err))
.map(|output| format!("`{}`", output))
},
callback,
error,
);
}

View File

@ -1,9 +1,7 @@
use tiny_http::{Header, Response};
include!(concat!(env!("OUT_DIR"), "/data.rs"));
pub fn asset_response(path: &str) -> Response<std::io::Cursor<Vec<u8>>> {
let asset = ASSETS
let asset = crate::assets::ASSETS
.get(&format!("{}{}", env!("TAURI_DIST_DIR"), path))
.unwrap()
.into_owned();