Feature/whitelist (#9)

* feat(proton) whitelist API features

* feat(whitelist) fix feature name for execute cmd

* fix(whitelist) conflicting command names with q-app

* feat(rust2018) cleanup (#8)

* rust 2018 edition changes

* fix whitespace

* change super::super to crate
This commit is contained in:
nothingismagick 2019-07-23 22:41:16 +02:00 committed by Lucas Fernandes Nogueira
parent b9cc35ca39
commit a1c46cd86f
42 changed files with 2293 additions and 248 deletions

View File

@ -1,3 +1,5 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "bitflags"
version = "1.1.0"

View File

@ -1,56 +1,49 @@
extern crate cc;
extern crate pkg_config;
use std::{
env,
path::{Path, PathBuf},
process::Command,
};
use std::{env, path::PathBuf};
fn main() {
let proton_path = PathBuf::from("../../../ui");
let proton_path = PathBuf::from("../../../ui");
let mut build = cc::Build::new();
let mut build = cc::Build::new();
build
.include(&proton_path)
.file("proton.c")
.flag_if_supported("-std=c11")
.flag_if_supported("-w");
if env::var("DEBUG").is_err() {
build.define("NDEBUG", None);
} else {
build.define("DEBUG", None);
}
let target = env::var("TARGET").unwrap();
if target.contains("windows") {
build.define("WEBVIEW_WINAPI", None);
for &lib in &["ole32", "comctl32", "oleaut32", "uuid", "gdi32"] {
println!("cargo:rustc-link-lib={}", lib);
}
} else if target.contains("linux") || target.contains("bsd") {
let webkit = pkg_config::Config::new()
.atleast_version("2.8")
.probe("webkit2gtk-4.0")
.unwrap();
for path in webkit.include_paths {
build.include(path);
}
build.define("WEBVIEW_GTK", None);
} else if target.contains("apple") {
build
.include(&proton_path)
.file("proton.c")
.flag_if_supported("-std=c11")
.flag_if_supported("-w");
.define("WEBVIEW_COCOA", None)
.flag("-x")
.flag("objective-c");
println!("cargo:rustc-link-lib=framework=Cocoa");
println!("cargo:rustc-link-lib=framework=WebKit");
} else {
panic!("unsupported target");
}
if env::var("DEBUG").is_err() {
build.define("NDEBUG", None);
} else {
build.define("DEBUG", None);
}
let target = env::var("TARGET").unwrap();
if target.contains("windows") {
build.define("WEBVIEW_WINAPI", None);
for &lib in &["ole32", "comctl32", "oleaut32", "uuid", "gdi32"] {
println!("cargo:rustc-link-lib={}", lib);
}
} else if target.contains("linux") || target.contains("bsd") {
let webkit = pkg_config::Config::new()
.atleast_version("2.8")
.probe("webkit2gtk-4.0")
.unwrap();
for path in webkit.include_paths {
build.include(path);
}
build.define("WEBVIEW_GTK", None);
} else if target.contains("apple") {
build
.define("WEBVIEW_COCOA", None)
.flag("-x")
.flag("objective-c");
println!("cargo:rustc-link-lib=framework=Cocoa");
println!("cargo:rustc-link-lib=framework=WebKit");
} else {
panic!("unsupported target");
}
build.compile("proton");
build.compile("proton");
}

View File

@ -6,41 +6,61 @@ extern crate bitflags;
use std::os::raw::*;
// https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs
#[repr(C)] pub struct CWebView { _private: [u8; 0] }
#[repr(C)]
pub struct CWebView {
_private: [u8; 0],
}
type ErasedExternalInvokeFn = extern "C" fn(webview: *mut CWebView, arg: *const c_char);
type ErasedDispatchFn = extern "C" fn(webview: *mut CWebView, arg: *mut c_void);
#[repr(C)]
pub enum DialogType {
Open = 0,
Save = 1,
Alert = 2,
Open = 0,
Save = 1,
Alert = 2,
}
bitflags! {
#[repr(C)]
pub struct DialogFlags: u32 {
const FILE = 0b0000;
const DIRECTORY = 0b0001;
const INFO = 0b0010;
const WARNING = 0b0100;
const ERROR = 0b0110;
}
#[repr(C)]
pub struct DialogFlags: u32 {
const FILE = 0b0000;
const DIRECTORY = 0b0001;
const INFO = 0b0010;
const WARNING = 0b0100;
const ERROR = 0b0110;
}
}
extern {
pub fn wrapper_webview_free(this: *mut CWebView);
pub fn wrapper_webview_new(title: *const c_char, url: *const c_char, width: c_int, height: c_int, resizable: c_int, debug: c_int, external_invoke_cb: Option<ErasedExternalInvokeFn>, userdata: *mut c_void) -> *mut CWebView;
pub fn webview_loop(this: *mut CWebView, blocking: c_int) -> c_int;
pub fn webview_terminate(this: *mut CWebView);
pub fn webview_exit(this: *mut CWebView);
pub fn wrapper_webview_get_userdata(this: *mut CWebView) -> *mut c_void;
pub fn webview_dispatch(this: *mut CWebView, f: Option<ErasedDispatchFn>, arg: *mut c_void);
pub fn webview_eval(this: *mut CWebView, js: *const c_char) -> c_int;
pub fn webview_inject_css(this: *mut CWebView, css: *const c_char) -> c_int;
pub fn webview_set_title(this: *mut CWebView, title: *const c_char);
pub fn webview_set_fullscreen(this: *mut CWebView, fullscreen: c_int);
pub fn webview_set_color(this: *mut CWebView, red: u8, green: u8, blue: u8, alpha: u8);
pub fn webview_dialog(this: *mut CWebView, dialog_type: DialogType, flags: DialogFlags, title: *const c_char, arg: *const c_char, result: *mut c_char, result_size: usize);
extern "C" {
pub fn wrapper_webview_free(this: *mut CWebView);
pub fn wrapper_webview_new(
title: *const c_char,
url: *const c_char,
width: c_int,
height: c_int,
resizable: c_int,
debug: c_int,
external_invoke_cb: Option<ErasedExternalInvokeFn>,
userdata: *mut c_void,
) -> *mut CWebView;
pub fn webview_loop(this: *mut CWebView, blocking: c_int) -> c_int;
pub fn webview_terminate(this: *mut CWebView);
pub fn webview_exit(this: *mut CWebView);
pub fn wrapper_webview_get_userdata(this: *mut CWebView) -> *mut c_void;
pub fn webview_dispatch(this: *mut CWebView, f: Option<ErasedDispatchFn>, arg: *mut c_void);
pub fn webview_eval(this: *mut CWebView, js: *const c_char) -> c_int;
pub fn webview_inject_css(this: *mut CWebView, css: *const c_char) -> c_int;
pub fn webview_set_title(this: *mut CWebView, title: *const c_char);
pub fn webview_set_fullscreen(this: *mut CWebView, fullscreen: c_int);
pub fn webview_set_color(this: *mut CWebView, red: u8, green: u8, blue: u8, alpha: u8);
pub fn webview_dialog(
this: *mut CWebView,
dialog_type: DialogType,
flags: DialogFlags,
title: *const c_char,
arg: *const c_char,
result: *mut c_char,
result_size: usize,
);
}

View File

@ -25,7 +25,7 @@ pub enum Error {
/// WebView was dropped.
Dispatch,
/// An user-specified error occurred. For use inside invoke and dispatch closures.
Custom(Box<CustomError>),
Custom(Box<dyn CustomError>),
}
impl Error {
@ -36,7 +36,7 @@ impl Error {
}
impl error::Error for Error {
fn cause(&self) -> Option<&error::Error> {
fn cause(&self) -> Option<&dyn error::Error> {
match self {
Error::NulByte(cause) => Some(cause),
_ => None,
@ -53,7 +53,7 @@ impl error::Error for Error {
}
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::UninitializedField(field) => write!(f, "Required field uninitialized: {}.", field),
Error::Initialization => write!(f, "Webview failed to initialize."),

View File

@ -16,7 +16,7 @@ use std::fmt::{self, Write};
///
/// view.eval(&format!("callback({});", web_view::escape(string)));
/// ```
pub fn escape(string: &str) -> Escaper {
pub fn escape(string: &str) -> Escaper<'_> {
Escaper(string)
}
@ -37,7 +37,7 @@ const SPECIAL: &[char] = &[
];
impl<'a> fmt::Display for Escaper<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let &Escaper(mut string) = self;
f.write_char('\'')?;

View File

@ -1,6 +1,6 @@
extern crate boxfnonce;
extern crate proton_sys as ffi;
extern crate urlencoding;
mod color;
mod dialog;
@ -75,7 +75,7 @@ pub struct WebViewBuilder<'a, T: 'a, I, C> {
impl<'a, T: 'a, I, C> Default for WebViewBuilder<'a, T, I, C>
where
I: FnMut(&mut WebView<T>, &str) -> WVResult + 'a,
I: FnMut(&mut WebView<'_, T>, &str) -> WVResult + 'a,
C: AsRef<str>,
{
fn default() -> Self {
@ -99,7 +99,7 @@ where
impl<'a, T: 'a, I, C> WebViewBuilder<'a, T, I, C>
where
I: FnMut(&mut WebView<T>, &str) -> WVResult + 'a,
I: FnMut(&mut WebView<'_, T>, &str) -> WVResult + 'a,
C: AsRef<str>,
{
/// Alias for [`WebViewBuilder::default()`].
@ -215,7 +215,7 @@ where
/// [`WebViewBuilder::default()`]: struct.WebviewBuilder.html#impl-Default
pub fn builder<'a, T, I, C>() -> WebViewBuilder<'a, T, I, C>
where
I: FnMut(&mut WebView<T>, &str) -> WVResult + 'a,
I: FnMut(&mut WebView<'_, T>, &str) -> WVResult + 'a,
C: AsRef<str>,
{
WebViewBuilder::new()
@ -224,7 +224,7 @@ where
struct UserData<'a, T> {
inner: T,
live: Arc<RwLock<()>>,
invoke_handler: Box<FnMut(&mut WebView<T>, &str) -> WVResult + 'a>,
invoke_handler: Box<dyn FnMut(&mut WebView<'_, T>, &str) -> WVResult + 'a>,
result: WVResult,
}
@ -234,7 +234,7 @@ struct UserData<'a, T> {
///
/// [`WebViewBuilder`]: struct.WebViewBuilder.html
#[derive(Debug)]
pub struct WebView<'a, T: 'a> {
pub struct WebView<'a, T> {
inner: *mut CWebView,
_phantom: PhantomData<&'a mut T>,
}
@ -252,7 +252,7 @@ impl<'a, T> WebView<'a, T> {
invoke_handler: I,
) -> WVResult<WebView<'a, T>>
where
I: FnMut(&mut WebView<T>, &str) -> WVResult + 'a,
I: FnMut(&mut WebView<'_, T>, &str) -> WVResult + 'a,
{
let user_data = Box::new(UserData {
inner: user_data,
@ -275,7 +275,7 @@ impl<'a, T> WebView<'a, T> {
);
if inner.is_null() {
Box::<UserData<T>>::from_raw(user_data_ptr);
Box::<UserData<'_, T>>::from_raw(user_data_ptr);
Err(Error::Initialization)
} else {
Ok(WebView::from_ptr(inner))
@ -473,7 +473,7 @@ impl<T> Handle<T> {
/// [`step()`]: struct.WebView.html#method.step
pub fn dispatch<F>(&self, f: F) -> WVResult
where
F: FnOnce(&mut WebView<T>) -> WVResult + Send + 'static,
F: FnOnce(&mut WebView<'_, T>) -> WVResult + Send + 'static,
{
// Abort if WebView has been dropped. Otherwise, keep it alive until closure has been
// dispatched.
@ -509,7 +509,7 @@ extern "C" fn ffi_dispatch_handler<T>(webview: *mut CWebView, arg: *mut c_void)
let mut handle = mem::ManuallyDrop::new(WebView::<T>::from_ptr(webview));
let result = {
let callback =
Box::<SendBoxFnOnce<'static, (&mut WebView<T>,), WVResult>>::from_raw(arg as _);
Box::<SendBoxFnOnce<'static, (&mut WebView<'_, T>,), WVResult>>::from_raw(arg as _);
callback.call(&mut handle)
};
handle.user_data_wrapper_mut().result = result;

2001
lib/rust/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -26,3 +26,15 @@ tar = "0.4"
flate2 = "1"
hyper-old-types = "0.11.0"
sysinfo = "0.9"
[features]
api = []
all-api = []
readTextFile = []
readBinaryFile = []
writeFile = []
listFiles = []
listDirs = []
setTitle = []
execute = []

75
lib/rust/src/api.rs Normal file
View File

@ -0,0 +1,75 @@
mod cmd;
use proton_ui::WebView;
#[allow(unused_variables)]
pub fn handler<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> bool {
#[cfg(feature = "api")]
{
use cmd::Cmd::*;
match serde_json::from_str(arg) {
Err(_) => false,
Ok(command) => {
match command {
#[cfg(any(feature = "all-api", feature = "readTextFile"))]
ReadTextFile {
path,
callback,
error,
} => {
super::file_system::read_text_file(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "readBinaryFile"))]
ReadBinaryFile {
path,
callback,
error,
} => {
super::file_system::read_binary_file(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "writeFile"))]
WriteFile {
file,
contents,
callback,
error,
} => {
super::file_system::write_file(webview, file, contents, callback, error);
}
#[cfg(any(feature = "all-api", feature = "listDirs"))]
ListDirs {
path,
callback,
error,
} => {
super::file_system::list_dirs(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "listFiles"))]
ListFiles {
path,
callback,
error,
} => {
super::file_system::list(webview, path, callback, error);
}
#[cfg(any(feature = "all-api", feature = "setTitle"))]
SetTitle { title } => {
webview.set_title(&title).unwrap();
}
#[cfg(any(feature = "all-api", feature = "execute"))]
Execute {
command,
args,
callback,
error,
} => {
super::command::call(webview, command, args, callback, error);
}
}
true
}
}
}
#[cfg(not(feature = "api"))]
false
}

View File

@ -1,37 +1,42 @@
#[derive(Deserialize)]
#[serde(tag = "cmd", rename_all = "camelCase")]
#[cfg(feature = "api")]
pub enum Cmd {
Init,
ReadAsString {
#[cfg(any(feature = "all-api", feature = "readTextFile"))]
ReadTextFile {
path: String,
callback: String,
error: String,
},
ReadAsBinary {
#[cfg(any(feature = "all-api", feature = "readBinaryFile"))]
ReadBinaryFile {
path: String,
callback: String,
error: String,
},
Write {
#[cfg(any(feature = "all-api", feature = "writeFile"))]
WriteFile {
file: String,
contents: String,
callback: String,
error: String,
},
List {
#[cfg(any(feature = "all-api", feature = "listFiles"))]
ListFiles {
path: String,
callback: String,
error: String,
},
#[cfg(any(feature = "all-api", feature = "listDirs"))]
ListDirs {
path: String,
callback: String,
error: String,
},
SetTitle {
title: String,
},
Call {
#[cfg(any(feature = "all-api", feature = "setTitle"))]
SetTitle { title: String },
#[cfg(any(feature = "all-api", feature = "execute"))]
Execute {
command: String,
args: Vec<String>,
callback: String,

View File

@ -1,63 +0,0 @@
mod cmd;
use proton_ui::WebView;
pub fn handler<T: 'static>(webview: &mut WebView<T>, arg: &str) -> bool {
use cmd::Cmd::*;
match serde_json::from_str(arg) {
Err(_) => false,
Ok(command) => {
match command {
Init => (),
ReadAsString {
path,
callback,
error,
} => {
super::file_system::read_text_file(webview, path, callback, error);
}
ReadAsBinary {
path,
callback,
error,
} => {
super::file_system::read_binary_file(webview, path, callback, error);
}
Write {
file,
contents,
callback,
error,
} => {
super::file_system::write_file(webview, file, contents, callback, error);
}
ListDirs {
path,
callback,
error,
} => {
super::file_system::list_dirs(webview, path, callback, error);
}
List {
path,
callback,
error,
} => {
super::file_system::list(webview, path, callback, error);
}
SetTitle { title } => {
webview.set_title(&title).unwrap();
}
Call {
command,
args,
callback,
error,
} => {
super::command::call(webview, command, args, callback, error);
}
}
true
}
}
}

View File

@ -59,7 +59,7 @@ pub fn spawn_relative_command(
}
pub fn call<T: 'static>(
webview: &mut WebView<T>,
webview: &mut WebView<'_, T>,
command: String,
args: Vec<String>,
callback: String,

4
lib/rust/src/dir/mod.rs → lib/rust/src/dir.rs Executable file → Normal file
View File

@ -1,5 +1,5 @@
extern crate dirs;
extern crate tempfile;
use tempfile;
mod utils;
use ignore::Walk;

View File

@ -1,7 +1,5 @@
use std::fs;
extern crate serde_json;
mod error;
mod extract;
mod file_move;

View File

@ -9,7 +9,7 @@ pub enum Error {
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use Error::*;
match *self {
Extract(ref s) => write!(f, "ExtractError: {}", s),
@ -24,7 +24,7 @@ impl std::error::Error for Error {
"File Error"
}
fn cause(&self) -> Option<&std::error::Error> {
fn cause(&self) -> Option<&dyn std::error::Error> {
use Error::*;
Some(match *self {
Io(ref e) => e,

View File

@ -1,9 +1,9 @@
extern crate either;
extern crate flate2;
extern crate tar;
extern crate zip;
use either;
use flate2;
use tar;
use zip;
use super::error::*;
use crate::file::error::*;
use either::Either;
use std::fs;
use std::io;

View File

@ -1,7 +1,7 @@
use std::fs;
use std::path;
use super::error::*;
use crate::file::error::*;
/// Moves a file from the given path to the specified destination.
///

View File

@ -1,13 +1,18 @@
use proton_ui::WebView;
use super::dir;
use super::file;
use super::run_async;
use crate::dir;
use crate::file;
use crate::run_async;
use std::fs::File;
use std::io::Write;
pub fn list<T: 'static>(webview: &mut WebView<T>, path: String, callback: String, error: String) {
pub fn list<T: 'static>(
webview: &mut WebView<'_, T>,
path: String,
callback: String,
error: String,
) {
run_async(
webview,
move || {
@ -20,7 +25,7 @@ pub fn list<T: 'static>(webview: &mut WebView<T>, path: String, callback: String
}
pub fn list_dirs<T: 'static>(
webview: &mut WebView<T>,
webview: &mut WebView<'_, T>,
path: String,
callback: String,
error: String,
@ -37,7 +42,7 @@ pub fn list_dirs<T: 'static>(
}
pub fn write_file<T: 'static>(
webview: &mut WebView<T>,
webview: &mut WebView<'_, T>,
file: String,
contents: String,
callback: String,
@ -60,7 +65,7 @@ pub fn write_file<T: 'static>(
}
pub fn read_text_file<T: 'static>(
webview: &mut WebView<T>,
webview: &mut WebView<'_, T>,
path: String,
callback: String,
error: String,
@ -80,7 +85,7 @@ pub fn read_text_file<T: 'static>(
}
pub fn read_binary_file<T: 'static>(
webview: &mut WebView<T>,
webview: &mut WebView<'_, T>,
path: String,
callback: String,
error: String,

View File

@ -1,5 +1,5 @@
extern crate pbr;
extern crate reqwest;
use pbr;
use reqwest;
use serde::Serialize;
use std::io;

View File

@ -11,7 +11,7 @@ pub enum Error {
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use Error::*;
match *self {
Download(ref s) => write!(f, "DownloadError: {}", s),
@ -27,7 +27,7 @@ impl std::error::Error for Error {
"Http Error"
}
fn cause(&self) -> Option<&std::error::Error> {
fn cause(&self) -> Option<&dyn std::error::Error> {
use Error::*;
Some(match *self {
Json(ref e) => e,

View File

@ -1,4 +1,3 @@
extern crate threadpool;
#[macro_use]
extern crate serde_derive;
@ -18,7 +17,6 @@ pub mod tcp;
pub mod updater;
pub mod version;
extern crate proton_ui;
use proton_ui::WebView;
use threadpool::ThreadPool;
@ -26,7 +24,7 @@ use threadpool::ThreadPool;
thread_local!(static POOL: ThreadPool = ThreadPool::new(4));
pub fn run_async<T: 'static, F: FnOnce() -> Result<String, String> + Send + 'static>(
webview: &mut WebView<T>,
webview: &mut WebView<'_, T>,
what: F,
callback: String,
error: String,

View File

@ -8,7 +8,7 @@ pub enum Error {
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use Error::*;
match *self {
Arch(ref s) => write!(f, "ArchError: {}", s),
@ -23,7 +23,7 @@ impl std::error::Error for Error {
"Platform Error"
}
fn cause(&self) -> Option<&std::error::Error> {
fn cause(&self) -> Option<&dyn std::error::Error> {
return None;
}
}

View File

@ -1,4 +1,4 @@
extern crate sysinfo;
use sysinfo;
pub use sysinfo::{Process, ProcessExt, Signal, System, SystemExt};

View File

@ -1,6 +1,6 @@
use std::net::TcpListener;
extern crate rand;
use rand;
use rand::distributions::{Distribution, Uniform};

View File

@ -1,11 +1,9 @@
extern crate hyper_old_types;
use std::env;
use std::fs;
use std::path::PathBuf;
use super::file::{Extract, Move};
use super::http;
use crate::file::{Extract, Move};
use crate::http;
pub mod github;

View File

@ -1,6 +1,6 @@
use super::super::file;
use super::super::http;
use super::super::version;
use crate::file;
use crate::http;
use crate::version;
use reqwest;
use std;
use zip::result::ZipError;
@ -18,7 +18,7 @@ pub enum Error {
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use Error::*;
match *self {
Updater(ref s) => write!(f, "UpdaterError: {}", s),
@ -38,7 +38,7 @@ impl std::error::Error for Error {
"Updater Error"
}
fn cause(&self) -> Option<&std::error::Error> {
fn cause(&self) -> Option<&dyn std::error::Error> {
use Error::*;
Some(match *self {
Io(ref e) => e,

View File

@ -1,8 +1,8 @@
mod release;
pub use super::error::Error;
pub use crate::updater::error::Error;
pub use release::*;
use super::super::http;
use crate::http;
pub fn get_latest_release(repo_owner: &str, repo_name: &str) -> Result<Release, Error> {
set_ssl_vars!();

View File

@ -1,4 +1,4 @@
use super::super::error::*;
use crate::updater::error::*;
use hyper_old_types::header::{LinkValue, RelationType};
use serde_json;

View File

@ -7,7 +7,7 @@ pub enum Error {
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use Error::*;
match *self {
SemVer(ref e) => write!(f, "SemVerError: {}", e),
@ -20,7 +20,7 @@ impl std::error::Error for Error {
"Version Error"
}
fn cause(&self) -> Option<&std::error::Error> {
fn cause(&self) -> Option<&dyn std::error::Error> {
use Error::*;
Some(match *self {
SemVer(ref e) => e,

View File

@ -1,3 +1,5 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "adler32"
version = "1.0.3"
@ -448,7 +450,7 @@ dependencies = [
"crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
"miniz_oxide_c_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -630,7 +632,7 @@ dependencies = [
[[package]]
name = "miniz_oxide"
version = "0.2.2"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
@ -638,13 +640,13 @@ dependencies = [
[[package]]
name = "miniz_oxide_c_api"
version = "0.2.2"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
"crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"miniz_oxide 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@ -1443,8 +1445,8 @@ dependencies = [
"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202"
"checksum miniz_oxide 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b6c3756d66cf286314d5f7ebe74886188a9a92f5eee68b06f31ac2b4f314c99d"
"checksum miniz_oxide_c_api 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5b78ca5446dd9fe0dab00e058731b6b08a8c1d2b9cdb8efb10876e24e9ae2494"
"checksum miniz_oxide 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c061edee74a88eb35d876ce88b94d77a0448a201de111c244b70d047f5820516"
"checksum miniz_oxide_c_api 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6c675792957b0d19933816c4e1d56663c341dd9bfa31cb2140ff2267c1d8ecf4"
"checksum msi 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a20bdea5e04f55fae0d8f89e88beec71822f2d63f61487ff2205d9d05b677923"
"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"

View File

@ -236,7 +236,7 @@ struct AppCategoryVisitor {
impl<'d> serde::de::Visitor<'d> for AppCategoryVisitor {
type Value = AppCategory;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.did_you_mean {
Some(string) => write!(
formatter,

View File

@ -1,3 +1,4 @@
use crate::ResultExt;
use std;
use std::ffi::OsStr;
use std::fs::{self, File};
@ -5,7 +6,6 @@ use std::io::{self, BufWriter, Write};
use std::path::{Component, Path, PathBuf};
use term;
use walkdir;
use crate::ResultExt;
/// Returns true if the path has a filename indicating that it is a high-desity
/// "retina" icon. Specifically, returns true the the file stem ends with

View File

@ -19,6 +19,7 @@
// generate postinst or prerm files.
use super::common;
use crate::{ResultExt, Settings};
use ar;
use icns;
use image::png::{PNGDecoder, PNGEncoder};
@ -32,7 +33,6 @@ use std::io::{self, Write};
use std::path::{Path, PathBuf};
use tar;
use walkdir::WalkDir;
use crate::{ResultExt, Settings};
pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
let arch = match settings.binary_arch() {

View File

@ -9,6 +9,7 @@
// explanation.
use super::common;
use crate::{ResultExt, Settings};
use icns;
use image::png::{PNGDecoder, PNGEncoder};
use image::{self, GenericImage, ImageDecoder};
@ -17,7 +18,6 @@ use std::ffi::OsStr;
use std::fs::{self, File};
use std::io::Write;
use std::path::{Path, PathBuf};
use crate::{ResultExt, Settings};
pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
common::print_warning("iOS bundle support is still experimental.")?;

View File

@ -1,5 +1,6 @@
use super::common;
use super::settings::Settings;
use crate::ResultExt;
use cab;
use msi;
use std;
@ -9,7 +10,6 @@ use std::fs;
use std::io::{self, Write};
use std::path::{Path, PathBuf};
use uuid::Uuid;
use crate::ResultExt;
type Package = msi::Package<fs::File>;
@ -319,7 +319,10 @@ fn divide_resources_into_cabinets(mut resources: Vec<ResourceInfo>) -> Vec<Cabin
// Creates the CAB archives within the package that contain the binary
// execuable and all the resource files.
fn generate_resource_cabinets(package: &mut Package, cabinets: &[CabinetInfo]) -> crate::Result<()> {
fn generate_resource_cabinets(
package: &mut Package,
cabinets: &[CabinetInfo],
) -> crate::Result<()> {
for cabinet_info in cabinets.iter() {
let mut builder = cab::CabinetBuilder::new();
let mut file_map = HashMap::<String, &Path>::new();
@ -351,7 +354,10 @@ fn generate_resource_cabinets(package: &mut Package, cabinets: &[CabinetInfo]) -
}
// Creates and populates the `Directory` database table for the package.
fn create_directory_table(package: &mut Package, directories: &[DirectoryInfo]) -> crate::Result<()> {
fn create_directory_table(
package: &mut Package,
directories: &[DirectoryInfo],
) -> crate::Result<()> {
package.create_table(
"Directory",
vec![

View File

@ -18,6 +18,7 @@
// files into the `Contents` directory of the bundle.
use super::common;
use crate::{ResultExt, Settings};
use chrono;
use dirs;
use icns;
@ -28,7 +29,6 @@ use std::fs::{self, File};
use std::io::prelude::*;
use std::io::{self, BufWriter};
use std::path::{Path, PathBuf};
use crate::{ResultExt, Settings};
pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
let app_bundle_name = format!("{}.app", settings.bundle_name());
@ -232,7 +232,10 @@ fn copy_frameworks_to_bundle(bundle_directory: &Path, settings: &Settings) -> cr
/// Given a list of icon files, try to produce an ICNS file in the resources
/// directory and return the path to it. Returns `Ok(None)` if no usable icons
/// were provided.
fn create_icns_file(resources_dir: &PathBuf, settings: &Settings) -> crate::Result<Option<PathBuf>> {
fn create_icns_file(
resources_dir: &PathBuf,
settings: &Settings,
) -> crate::Result<Option<PathBuf>> {
if settings.icon_files().count() == 0 {
return Ok(None);
}

View File

@ -1,5 +1,5 @@
use std::path::PathBuf;
use crate::Settings;
use std::path::PathBuf;
pub fn bundle_project(_settings: &Settings) -> crate::Result<Vec<PathBuf>> {
unimplemented!();

View File

@ -138,7 +138,7 @@ impl CargoSettings {
}
impl Settings {
pub fn new(current_dir: PathBuf, matches: & ArgMatches) -> crate::Result<Self> {
pub fn new(current_dir: PathBuf, matches: &ArgMatches<'_>) -> crate::Result<Self> {
let package_type = match matches.value_of("format") {
Some(name) => match PackageType::from_short_name(name) {
Some(package_type) => Some(package_type),
@ -159,7 +159,13 @@ impl Settings {
None => None,
};
let features = if matches.is_present("features") {
Some(matches.values_of("features").unwrap().map(|s| s.to_string()).collect())
Some(
matches
.values_of("features")
.unwrap()
.map(|s| s.to_string())
.collect(),
)
} else {
None
};
@ -347,7 +353,7 @@ impl Settings {
}
/// Returns an iterator over the icon files to be used for this bundle.
pub fn icon_files(&self) -> ResourcePaths {
pub fn icon_files(&self) -> ResourcePaths<'_> {
match self.bundle_settings.icon {
Some(ref paths) => ResourcePaths::new(paths.as_slice(), false),
None => ResourcePaths::new(&[], false),
@ -356,7 +362,7 @@ impl Settings {
/// Returns an iterator over the resource files to be included in this
/// bundle.
pub fn resource_files(&self) -> ResourcePaths {
pub fn resource_files(&self) -> ResourcePaths<'_> {
match self.bundle_settings.resources {
Some(ref paths) => ResourcePaths::new(paths.as_slice(), true),
None => ResourcePaths::new(&[], true),

View File

@ -1,27 +1,11 @@
extern crate ar;
extern crate cab;
extern crate chrono;
#[macro_use]
extern crate clap;
extern crate dirs;
#[macro_use]
extern crate error_chain;
extern crate glob;
extern crate icns;
extern crate image;
extern crate libflate;
extern crate md5;
extern crate msi;
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate strsim;
extern crate tar;
extern crate target_build_utils;
extern crate term;
extern crate toml;
extern crate uuid;
extern crate walkdir;
#[cfg(test)]
extern crate tempfile;
@ -69,7 +53,7 @@ fn build_project_if_unbuilt(settings: &Settings) -> crate::Result<()> {
match settings.build_features() {
Some(features) => {
args.push(format!("--features={}", features.join(" ")));
},
}
None => {}
}