mirror of
https://github.com/haraldh/chainerror.git
synced 2025-01-31 00:56:41 +01:00
deploy: 1d43a39c61
This commit is contained in:
parent
bc07729890
commit
12caec03a0
194
book.js
194
book.js
|
@ -16,9 +16,6 @@ function playpen_text(playpen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
(function codeSnippets() {
|
(function codeSnippets() {
|
||||||
// Hide Rust code lines prepended with a specific character
|
|
||||||
var hiding_character = "#";
|
|
||||||
|
|
||||||
function fetch_with_timeout(url, options, timeout = 6000) {
|
function fetch_with_timeout(url, options, timeout = 6000) {
|
||||||
return Promise.race([
|
return Promise.race([
|
||||||
fetch(url, options),
|
fetch(url, options),
|
||||||
|
@ -55,6 +52,15 @@ function playpen_text(playpen) {
|
||||||
editor.addEventListener("change", function (e) {
|
editor.addEventListener("change", function (e) {
|
||||||
update_play_button(playpen_block, playground_crates);
|
update_play_button(playpen_block, playground_crates);
|
||||||
});
|
});
|
||||||
|
// add Ctrl-Enter command to execute rust code
|
||||||
|
editor.commands.addCommand({
|
||||||
|
name: "run",
|
||||||
|
bindKey: {
|
||||||
|
win: "Ctrl-Enter",
|
||||||
|
mac: "Ctrl-Enter"
|
||||||
|
},
|
||||||
|
exec: _editor => run_rust_code(playpen_block)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,31 +107,24 @@ function playpen_text(playpen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let text = playpen_text(code_block);
|
let text = playpen_text(code_block);
|
||||||
|
let classes = code_block.querySelector('code').classList;
|
||||||
|
let has_2018 = classes.contains("edition2018");
|
||||||
|
let edition = has_2018 ? "2018" : "2015";
|
||||||
|
|
||||||
var params = {
|
var params = {
|
||||||
channel: "stable",
|
version: "stable",
|
||||||
mode: "debug",
|
optimize: "0",
|
||||||
edition: "2018",
|
code: text,
|
||||||
crateType: "bin",
|
edition: edition
|
||||||
tests: false,
|
|
||||||
code: text
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (text.indexOf("#![feature") !== -1) {
|
if (text.indexOf("#![feature") !== -1) {
|
||||||
params.channel = "nightly";
|
params.version = "nightly";
|
||||||
}
|
|
||||||
|
|
||||||
if (text.indexOf("#[test]") !== -1) {
|
|
||||||
params.tests = "true";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text.indexOf("#![crate_type=\"lib\"]") !== -1) {
|
|
||||||
params.crateType = "lib";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result_block.innerText = "Running...";
|
result_block.innerText = "Running...";
|
||||||
|
|
||||||
fetch_with_timeout("https://play.rust-lang.org/execute", {
|
fetch_with_timeout("https://play.rust-lang.org/evaluate.json", {
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': "application/json",
|
'Content-Type': "application/json",
|
||||||
},
|
},
|
||||||
|
@ -134,7 +133,7 @@ function playpen_text(playpen) {
|
||||||
body: JSON.stringify(params)
|
body: JSON.stringify(params)
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(response => result_block.innerText = response.stderr + "\n\n" + response.stdout)
|
.then(response => result_block.innerText = response.result)
|
||||||
.catch(error => result_block.innerText = "Playground Communication: " + error.message);
|
.catch(error => result_block.innerText = "Playground Communication: " + error.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,95 +167,59 @@ function playpen_text(playpen) {
|
||||||
|
|
||||||
Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) {
|
Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) {
|
||||||
|
|
||||||
var code_block = block;
|
var lines = Array.from(block.querySelectorAll('.boring'));
|
||||||
var pre_block = block.parentNode;
|
|
||||||
// hide lines
|
|
||||||
var lines = code_block.innerHTML.split("\n");
|
|
||||||
var first_non_hidden_line = false;
|
|
||||||
var lines_hidden = false;
|
|
||||||
var trimmed_line = "";
|
|
||||||
|
|
||||||
for (var n = 0; n < lines.length; n++) {
|
|
||||||
trimmed_line = lines[n].trim();
|
|
||||||
if (trimmed_line[0] == hiding_character && trimmed_line[1] != hiding_character) {
|
|
||||||
if (first_non_hidden_line) {
|
|
||||||
lines[n] = "<span class=\"hidden\">" + "\n" + lines[n].replace(/(\s*)# ?/, "$1") + "</span>";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
lines[n] = "<span class=\"hidden\">" + lines[n].replace(/(\s*)# ?/, "$1") + "\n" + "</span>";
|
|
||||||
}
|
|
||||||
lines_hidden = true;
|
|
||||||
}
|
|
||||||
else if (first_non_hidden_line) {
|
|
||||||
lines[n] = "\n" + lines[n];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
first_non_hidden_line = true;
|
|
||||||
}
|
|
||||||
if (trimmed_line[0] == hiding_character && trimmed_line[1] == hiding_character) {
|
|
||||||
lines[n] = lines[n].replace("##", "#")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
code_block.innerHTML = lines.join("");
|
|
||||||
|
|
||||||
// If no lines were hidden, return
|
// If no lines were hidden, return
|
||||||
if (!lines_hidden) { return; }
|
if (!lines.length) { return; }
|
||||||
|
block.classList.add("hide-boring");
|
||||||
|
|
||||||
var buttons = document.createElement('div');
|
var buttons = document.createElement('div');
|
||||||
buttons.className = 'buttons';
|
buttons.className = 'buttons';
|
||||||
buttons.innerHTML = "<button class=\"fa fa-expand\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>";
|
buttons.innerHTML = "<button class=\"fa fa-expand\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>";
|
||||||
|
|
||||||
// add expand button
|
// add expand button
|
||||||
|
var pre_block = block.parentNode;
|
||||||
pre_block.insertBefore(buttons, pre_block.firstChild);
|
pre_block.insertBefore(buttons, pre_block.firstChild);
|
||||||
|
|
||||||
pre_block.querySelector('.buttons').addEventListener('click', function (e) {
|
pre_block.querySelector('.buttons').addEventListener('click', function (e) {
|
||||||
if (e.target.classList.contains('fa-expand')) {
|
if (e.target.classList.contains('fa-expand')) {
|
||||||
var lines = pre_block.querySelectorAll('span.hidden');
|
|
||||||
|
|
||||||
e.target.classList.remove('fa-expand');
|
e.target.classList.remove('fa-expand');
|
||||||
e.target.classList.add('fa-compress');
|
e.target.classList.add('fa-compress');
|
||||||
e.target.title = 'Hide lines';
|
e.target.title = 'Hide lines';
|
||||||
e.target.setAttribute('aria-label', e.target.title);
|
e.target.setAttribute('aria-label', e.target.title);
|
||||||
|
|
||||||
Array.from(lines).forEach(function (line) {
|
block.classList.remove('hide-boring');
|
||||||
line.classList.remove('hidden');
|
|
||||||
line.classList.add('unhidden');
|
|
||||||
});
|
|
||||||
} else if (e.target.classList.contains('fa-compress')) {
|
} else if (e.target.classList.contains('fa-compress')) {
|
||||||
var lines = pre_block.querySelectorAll('span.unhidden');
|
|
||||||
|
|
||||||
e.target.classList.remove('fa-compress');
|
e.target.classList.remove('fa-compress');
|
||||||
e.target.classList.add('fa-expand');
|
e.target.classList.add('fa-expand');
|
||||||
e.target.title = 'Show hidden lines';
|
e.target.title = 'Show hidden lines';
|
||||||
e.target.setAttribute('aria-label', e.target.title);
|
e.target.setAttribute('aria-label', e.target.title);
|
||||||
|
|
||||||
Array.from(lines).forEach(function (line) {
|
block.classList.add('hide-boring');
|
||||||
line.classList.remove('unhidden');
|
|
||||||
line.classList.add('hidden');
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Array.from(document.querySelectorAll('pre code')).forEach(function (block) {
|
if (window.playpen_copyable) {
|
||||||
var pre_block = block.parentNode;
|
Array.from(document.querySelectorAll('pre code')).forEach(function (block) {
|
||||||
if (!pre_block.classList.contains('playpen')) {
|
var pre_block = block.parentNode;
|
||||||
var buttons = pre_block.querySelector(".buttons");
|
if (!pre_block.classList.contains('playpen')) {
|
||||||
if (!buttons) {
|
var buttons = pre_block.querySelector(".buttons");
|
||||||
buttons = document.createElement('div');
|
if (!buttons) {
|
||||||
buttons.className = 'buttons';
|
buttons = document.createElement('div');
|
||||||
pre_block.insertBefore(buttons, pre_block.firstChild);
|
buttons.className = 'buttons';
|
||||||
|
pre_block.insertBefore(buttons, pre_block.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
var clipButton = document.createElement('button');
|
||||||
|
clipButton.className = 'fa fa-copy clip-button';
|
||||||
|
clipButton.title = 'Copy to clipboard';
|
||||||
|
clipButton.setAttribute('aria-label', clipButton.title);
|
||||||
|
clipButton.innerHTML = '<i class=\"tooltiptext\"></i>';
|
||||||
|
|
||||||
|
buttons.insertBefore(clipButton, buttons.firstChild);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
var clipButton = document.createElement('button');
|
}
|
||||||
clipButton.className = 'fa fa-copy clip-button';
|
|
||||||
clipButton.title = 'Copy to clipboard';
|
|
||||||
clipButton.setAttribute('aria-label', clipButton.title);
|
|
||||||
clipButton.innerHTML = '<i class=\"tooltiptext\"></i>';
|
|
||||||
|
|
||||||
buttons.insertBefore(clipButton, buttons.firstChild);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Process playpen code blocks
|
// Process playpen code blocks
|
||||||
Array.from(document.querySelectorAll(".playpen")).forEach(function (pre_block) {
|
Array.from(document.querySelectorAll(".playpen")).forEach(function (pre_block) {
|
||||||
|
@ -274,19 +237,21 @@ function playpen_text(playpen) {
|
||||||
runCodeButton.title = 'Run this code';
|
runCodeButton.title = 'Run this code';
|
||||||
runCodeButton.setAttribute('aria-label', runCodeButton.title);
|
runCodeButton.setAttribute('aria-label', runCodeButton.title);
|
||||||
|
|
||||||
var copyCodeClipboardButton = document.createElement('button');
|
|
||||||
copyCodeClipboardButton.className = 'fa fa-copy clip-button';
|
|
||||||
copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>';
|
|
||||||
copyCodeClipboardButton.title = 'Copy to clipboard';
|
|
||||||
copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title);
|
|
||||||
|
|
||||||
buttons.insertBefore(runCodeButton, buttons.firstChild);
|
buttons.insertBefore(runCodeButton, buttons.firstChild);
|
||||||
buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild);
|
|
||||||
|
|
||||||
runCodeButton.addEventListener('click', function (e) {
|
runCodeButton.addEventListener('click', function (e) {
|
||||||
run_rust_code(pre_block);
|
run_rust_code(pre_block);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (window.playpen_copyable) {
|
||||||
|
var copyCodeClipboardButton = document.createElement('button');
|
||||||
|
copyCodeClipboardButton.className = 'fa fa-copy clip-button';
|
||||||
|
copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>';
|
||||||
|
copyCodeClipboardButton.title = 'Copy to clipboard';
|
||||||
|
copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title);
|
||||||
|
|
||||||
|
buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
let code_block = pre_block.querySelector("code");
|
let code_block = pre_block.querySelector("code");
|
||||||
if (window.ace && code_block.classList.contains("editable")) {
|
if (window.ace && code_block.classList.contains("editable")) {
|
||||||
var undoChangesButton = document.createElement('button');
|
var undoChangesButton = document.createElement('button');
|
||||||
|
@ -328,7 +293,7 @@ function playpen_text(playpen) {
|
||||||
themeToggleButton.focus();
|
themeToggleButton.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
function set_theme(theme) {
|
function set_theme(theme, store = true) {
|
||||||
let ace_theme;
|
let ace_theme;
|
||||||
|
|
||||||
if (theme == 'coal' || theme == 'navy') {
|
if (theme == 'coal' || theme == 'navy') {
|
||||||
|
@ -341,13 +306,11 @@ function playpen_text(playpen) {
|
||||||
stylesheets.ayuHighlight.disabled = false;
|
stylesheets.ayuHighlight.disabled = false;
|
||||||
stylesheets.tomorrowNight.disabled = true;
|
stylesheets.tomorrowNight.disabled = true;
|
||||||
stylesheets.highlight.disabled = true;
|
stylesheets.highlight.disabled = true;
|
||||||
|
|
||||||
ace_theme = "ace/theme/tomorrow_night";
|
ace_theme = "ace/theme/tomorrow_night";
|
||||||
} else {
|
} else {
|
||||||
stylesheets.ayuHighlight.disabled = true;
|
stylesheets.ayuHighlight.disabled = true;
|
||||||
stylesheets.tomorrowNight.disabled = true;
|
stylesheets.tomorrowNight.disabled = true;
|
||||||
stylesheets.highlight.disabled = false;
|
stylesheets.highlight.disabled = false;
|
||||||
|
|
||||||
ace_theme = "ace/theme/dawn";
|
ace_theme = "ace/theme/dawn";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,9 +328,10 @@ function playpen_text(playpen) {
|
||||||
try { previousTheme = localStorage.getItem('mdbook-theme'); } catch (e) { }
|
try { previousTheme = localStorage.getItem('mdbook-theme'); } catch (e) { }
|
||||||
if (previousTheme === null || previousTheme === undefined) { previousTheme = default_theme; }
|
if (previousTheme === null || previousTheme === undefined) { previousTheme = default_theme; }
|
||||||
|
|
||||||
try { localStorage.setItem('mdbook-theme', theme); } catch (e) { }
|
if (store) {
|
||||||
|
try { localStorage.setItem('mdbook-theme', theme); } catch (e) { }
|
||||||
|
}
|
||||||
|
|
||||||
document.body.className = theme;
|
|
||||||
html.classList.remove(previousTheme);
|
html.classList.remove(previousTheme);
|
||||||
html.classList.add(theme);
|
html.classList.add(theme);
|
||||||
}
|
}
|
||||||
|
@ -377,7 +341,7 @@ function playpen_text(playpen) {
|
||||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||||
|
|
||||||
set_theme(theme);
|
set_theme(theme, false);
|
||||||
|
|
||||||
themeToggleButton.addEventListener('click', function () {
|
themeToggleButton.addEventListener('click', function () {
|
||||||
if (themePopup.style.display === 'block') {
|
if (themePopup.style.display === 'block') {
|
||||||
|
@ -399,7 +363,7 @@ function playpen_text(playpen) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang-nursery/mdBook/issues/628
|
// Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628
|
||||||
document.addEventListener('click', function(e) {
|
document.addEventListener('click', function(e) {
|
||||||
if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) {
|
if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) {
|
||||||
hideThemes();
|
hideThemes();
|
||||||
|
@ -444,8 +408,10 @@ function playpen_text(playpen) {
|
||||||
(function sidebar() {
|
(function sidebar() {
|
||||||
var html = document.querySelector("html");
|
var html = document.querySelector("html");
|
||||||
var sidebar = document.getElementById("sidebar");
|
var sidebar = document.getElementById("sidebar");
|
||||||
|
var sidebarScrollBox = document.getElementById("sidebar-scrollbox");
|
||||||
var sidebarLinks = document.querySelectorAll('#sidebar a');
|
var sidebarLinks = document.querySelectorAll('#sidebar a');
|
||||||
var sidebarToggleButton = document.getElementById("sidebar-toggle");
|
var sidebarToggleButton = document.getElementById("sidebar-toggle");
|
||||||
|
var sidebarResizeHandle = document.getElementById("sidebar-resize-handle");
|
||||||
var firstContact = null;
|
var firstContact = null;
|
||||||
|
|
||||||
function showSidebar() {
|
function showSidebar() {
|
||||||
|
@ -459,6 +425,17 @@ function playpen_text(playpen) {
|
||||||
try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { }
|
try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle');
|
||||||
|
|
||||||
|
function toggleSection(ev) {
|
||||||
|
ev.currentTarget.parentElement.classList.toggle('expanded');
|
||||||
|
}
|
||||||
|
|
||||||
|
Array.from(sidebarAnchorToggles).forEach(function (el) {
|
||||||
|
el.addEventListener('click', toggleSection);
|
||||||
|
});
|
||||||
|
|
||||||
function hideSidebar() {
|
function hideSidebar() {
|
||||||
html.classList.remove('sidebar-visible')
|
html.classList.remove('sidebar-visible')
|
||||||
html.classList.add('sidebar-hidden');
|
html.classList.add('sidebar-hidden');
|
||||||
|
@ -485,6 +462,23 @@ function playpen_text(playpen) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
sidebarResizeHandle.addEventListener('mousedown', initResize, false);
|
||||||
|
|
||||||
|
function initResize(e) {
|
||||||
|
window.addEventListener('mousemove', resize, false);
|
||||||
|
window.addEventListener('mouseup', stopResize, false);
|
||||||
|
html.classList.add('sidebar-resizing');
|
||||||
|
}
|
||||||
|
function resize(e) {
|
||||||
|
document.documentElement.style.setProperty('--sidebar-width', (e.clientX - sidebar.offsetLeft) + 'px');
|
||||||
|
}
|
||||||
|
//on mouseup remove windows functions mousemove & mouseup
|
||||||
|
function stopResize(e) {
|
||||||
|
html.classList.remove('sidebar-resizing');
|
||||||
|
window.removeEventListener('mousemove', resize, false);
|
||||||
|
window.removeEventListener('mouseup', stopResize, false);
|
||||||
|
}
|
||||||
|
|
||||||
document.addEventListener('touchstart', function (e) {
|
document.addEventListener('touchstart', function (e) {
|
||||||
firstContact = {
|
firstContact = {
|
||||||
x: e.touches[0].clientX,
|
x: e.touches[0].clientX,
|
||||||
|
@ -513,7 +507,7 @@ function playpen_text(playpen) {
|
||||||
// Scroll sidebar to current active section
|
// Scroll sidebar to current active section
|
||||||
var activeSection = sidebar.querySelector(".active");
|
var activeSection = sidebar.querySelector(".active");
|
||||||
if (activeSection) {
|
if (activeSection) {
|
||||||
sidebar.scrollTop = activeSection.offsetTop;
|
sidebarScrollBox.scrollTop = activeSection.offsetTop;
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
@ -554,7 +548,7 @@ function playpen_text(playpen) {
|
||||||
elem.className = 'fa fa-copy tooltipped';
|
elem.className = 'fa fa-copy tooltipped';
|
||||||
}
|
}
|
||||||
|
|
||||||
var clipboardSnippets = new Clipboard('.clip-button', {
|
var clipboardSnippets = new ClipboardJS('.clip-button', {
|
||||||
text: function (trigger) {
|
text: function (trigger) {
|
||||||
hideTooltip(trigger);
|
hideTooltip(trigger);
|
||||||
let playpen = trigger.closest("pre");
|
let playpen = trigger.closest("pre");
|
||||||
|
@ -606,6 +600,6 @@ function playpen_text(playpen) {
|
||||||
menu.classList.remove('bordered');
|
menu.classList.remove('bordered');
|
||||||
}
|
}
|
||||||
|
|
||||||
previousScrollTop = document.scrollingElement.scrollTop;
|
previousScrollTop = Math.max(document.scrollingElement.scrollTop, 0);
|
||||||
}, { passive: true });
|
}, { passive: true });
|
||||||
})();
|
})();
|
||||||
|
|
14434
print.html
14434
print.html
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -160,32 +160,32 @@ prints out the last <code>Error</code>.</p>
|
||||||
and improves inspecting the sources of an error.</p>
|
and improves inspecting the sources of an error.</p>
|
||||||
<p>You can also run the tutorial examples in the checked out
|
<p>You can also run the tutorial examples in the checked out
|
||||||
<a href="https://github.com/haraldh/chainerror">chainerror git repo</a>.</p>
|
<a href="https://github.com/haraldh/chainerror">chainerror git repo</a>.</p>
|
||||||
<pre><code>$ cargo run -q --example tutorial1
|
<pre><code class="language-console">$ cargo run -q --example tutorial1
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<pre><pre class="playpen"><code class="language-rust">use std::error::Error;
|
<pre><pre class="playpen"><code class="language-rust">use std::error::Error;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::result::Result;
|
use std::result::Result;
|
||||||
|
|
||||||
fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
|
fn do_some_io() -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
Err(io::Error::from(io::ErrorKind::NotFound))?;
|
Err(io::Error::from(io::ErrorKind::NotFound))?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn func2() -> Result<(), Box<Error + Send + Sync>> {
|
fn func2() -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
if let Err(_) = do_some_io() {
|
if let Err(_) = do_some_io() {
|
||||||
Err("func2 error")?;
|
Err("func2 error")?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn func1() -> Result<(), Box<Error + Send + Sync>> {
|
fn func1() -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
if let Err(_) = func2() {
|
if let Err(_) = func2() {
|
||||||
Err("func1 error")?;
|
Err("func1 error")?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<Error + Send + Sync>> {
|
fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
func1()
|
func1()
|
||||||
}
|
}
|
||||||
</code></pre></pre>
|
</code></pre></pre>
|
||||||
|
|
1200
tutorial10.html
1200
tutorial10.html
File diff suppressed because it is too large
Load diff
1200
tutorial11.html
1200
tutorial11.html
File diff suppressed because it is too large
Load diff
1200
tutorial12.html
1200
tutorial12.html
File diff suppressed because it is too large
Load diff
1202
tutorial13.html
1202
tutorial13.html
File diff suppressed because it is too large
Load diff
|
@ -335,7 +335,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<std::error::Error + Send + Sync>> {
|
fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||||
use mycrate::func1;
|
use mycrate::func1;
|
||||||
use mycrate::ErrorKind;
|
use mycrate::ErrorKind;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
@ -350,7 +350,7 @@ fn main() -> Result<(), Box<std::error::Error + Send + Sync>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
eprintln!();
|
eprintln!();
|
||||||
let mut s: &Error = &e;
|
let mut s: &dyn Error = &e;
|
||||||
while let Some(c) = s.source() {
|
while let Some(c) = s.source() {
|
||||||
if let Some(ioerror) = c.downcast_ref::<io::Error>() {
|
if let Some(ioerror) = c.downcast_ref::<io::Error>() {
|
||||||
eprintln!("caused by: std::io::Error: {}", ioerror);
|
eprintln!("caused by: std::io::Error: {}", ioerror);
|
||||||
|
|
1202
tutorial2.html
1202
tutorial2.html
File diff suppressed because it is too large
Load diff
1202
tutorial3.html
1202
tutorial3.html
File diff suppressed because it is too large
Load diff
1202
tutorial4.html
1202
tutorial4.html
File diff suppressed because it is too large
Load diff
1202
tutorial5.html
1202
tutorial5.html
File diff suppressed because it is too large
Load diff
1204
tutorial6.html
1204
tutorial6.html
File diff suppressed because it is too large
Load diff
1202
tutorial7.html
1202
tutorial7.html
File diff suppressed because it is too large
Load diff
1202
tutorial8.html
1202
tutorial8.html
File diff suppressed because it is too large
Load diff
1202
tutorial9.html
1202
tutorial9.html
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue