This commit is contained in:
haraldh 2020-03-03 14:08:09 +00:00
parent 4dfb67bc45
commit bc07729890
27 changed files with 1540 additions and 22567 deletions

View file

@ -69,3 +69,11 @@ Original by Dempfi (https://github.com/dempfi/ayu)
.hljs-strong { .hljs-strong {
font-weight: bold; font-weight: bold;
} }
.hljs-addition {
color: #91b362;
}
.hljs-deletion {
color: #d96c75;
}

6
clipboard.min.js vendored

File diff suppressed because one or more lines are too long

View file

@ -8,7 +8,9 @@
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background: var(--scrollbar); background: var(--scrollbar);
} }
html {
scrollbar-color: var(--scrollbar) var(--bg);
}
#searchresults a, #searchresults a,
.content a:link, .content a:link,
a:visited, a:visited,
@ -43,7 +45,7 @@ a > .hljs {
position: relative; position: relative;
padding: 0 8px; padding: 0 8px;
z-index: 10; z-index: 10;
line-height: 50px; line-height: var(--menu-bar-height);
cursor: pointer; cursor: pointer;
transition: color 0.5s; transition: color 0.5s;
} }
@ -71,22 +73,22 @@ a > .hljs {
} }
html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-container { html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-container {
transform: translateY(-60px); transform: translateY(calc(-10px - var(--menu-bar-height)));
} }
.left-buttons { .left-buttons {
display: flex; display: flex;
margin: 0 5px; margin: 0 5px;
} }
.no-js .left-buttons { .no-js .left-buttons {
display: none; display: none;
} }
.menu-title { .menu-title {
display: inline-block; display: inline-block;
font-weight: 200; font-weight: 200;
font-size: 20px; font-size: 2rem;
line-height: 50px; line-height: var(--menu-bar-height);
text-align: center; text-align: center;
margin: 0; margin: 0;
flex: 1; flex: 1;
@ -124,7 +126,7 @@ html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-conta
text-decoration: none; text-decoration: none;
position: fixed; position: fixed;
top: 50px; /* Height of menu-bar */ top: 0;
bottom: 0; bottom: 0;
margin: 0; margin: 0;
max-width: 150px; max-width: 150px;
@ -135,17 +137,21 @@ html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-conta
align-content: center; align-content: center;
flex-direction: column; flex-direction: column;
transition: color 0.5s; transition: color 0.5s, background-color 0.5s;
} }
.nav-chapters:hover { text-decoration: none; } .nav-chapters:hover {
text-decoration: none;
background-color: var(--theme-hover);
transition: background-color 0.15s, color 0.15s;
}
.nav-wrapper { .nav-wrapper {
margin-top: 50px; margin-top: 50px;
display: none; display: none;
} }
.mobile-nav-chapters { .mobile-nav-chapters {
font-size: 2.5em; font-size: 2.5em;
text-align: center; text-align: center;
text-decoration: none; text-decoration: none;
@ -176,11 +182,14 @@ html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-conta
/* Inline code */ /* Inline code */
:not(pre) > .hljs { :not(pre) > .hljs {
display: inline-block; display: inline;
vertical-align: middle;
padding: 0.1em 0.3em; padding: 0.1em 0.3em;
border-radius: 3px; border-radius: 3px;
}
:not(pre):not(a) > .hljs {
color: var(--inline-code-color); color: var(--inline-code-color);
overflow-x: initial;
} }
a:hover > .hljs { a:hover > .hljs {
@ -301,8 +310,6 @@ ul#searchresults span.teaser em {
top: 0; top: 0;
bottom: 0; bottom: 0;
width: var(--sidebar-width); width: var(--sidebar-width);
overflow-y: auto;
padding: 10px 10px;
font-size: 0.875em; font-size: 0.875em;
box-sizing: border-box; box-sizing: border-box;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
@ -310,12 +317,39 @@ ul#searchresults span.teaser em {
background-color: var(--sidebar-bg); background-color: var(--sidebar-bg);
color: var(--sidebar-fg); color: var(--sidebar-fg);
} }
.js .sidebar { .sidebar-resizing {
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.js:not(.sidebar-resizing) .sidebar {
transition: transform 0.3s; /* Animation: slide away */ transition: transform 0.3s; /* Animation: slide away */
} }
.sidebar code { .sidebar code {
line-height: 2em; line-height: 2em;
} }
.sidebar .sidebar-scrollbox {
overflow-y: auto;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
padding: 10px 10px;
}
.sidebar .sidebar-resize-handle {
position: absolute;
cursor: col-resize;
width: 0;
right: 0;
top: 0;
bottom: 0;
}
.js .sidebar .sidebar-resize-handle {
cursor: col-resize;
width: 5px;
}
.sidebar-hidden .sidebar { .sidebar-hidden .sidebar {
transform: translateX(calc(0px - var(--sidebar-width))); transform: translateX(calc(0px - var(--sidebar-width)));
} }
@ -341,22 +375,52 @@ ul#searchresults span.teaser em {
padding-left: 0; padding-left: 0;
line-height: 2.2em; line-height: 2.2em;
} }
.chapter ol {
width: 100%;
}
.chapter li { .chapter li {
display: flex;
color: var(--sidebar-non-existant); color: var(--sidebar-non-existant);
} }
.chapter li a { .chapter li a {
color: var(--sidebar-fg);
display: block; display: block;
padding: 0; padding: 0;
text-decoration: none; text-decoration: none;
color: var(--sidebar-fg);
} }
.chapter li a:hover { text-decoration: none }
.chapter li .active, .chapter li a:hover {
a:hover {
/* Animate color change */
color: var(--sidebar-active); color: var(--sidebar-active);
} }
.chapter li a.active {
color: var(--sidebar-active);
}
.chapter li > a.toggle {
cursor: pointer;
display: block;
margin-left: auto;
padding: 0 10px;
user-select: none;
opacity: 0.68;
}
.chapter li > a.toggle div {
transition: transform 0.5s;
}
/* collapse the section */
.chapter li:not(.expanded) + li > ol {
display: none;
}
.chapter li.expanded > a.toggle div {
transform: rotate(90deg);
}
.spacer { .spacer {
width: 100%; width: 100%;
height: 3px; height: 3px;
@ -366,7 +430,7 @@ a:hover {
background-color: var(--sidebar-spacer); background-color: var(--sidebar-spacer);
} }
@media (-moz-touch-enabled: 1), (pointer: coarse) { @media (-moz-touch-enabled: 1), (pointer: coarse) {
.chapter li a { padding: 5px 0; } .chapter li a { padding: 5px 0; }
.spacer { margin: 10px 0; } .spacer { margin: 10px 0; }
} }
@ -382,7 +446,7 @@ a:hover {
.theme-popup { .theme-popup {
position: absolute; position: absolute;
left: 10px; left: 10px;
top: 50px; top: var(--menu-bar-height);
z-index: 1000; z-index: 1000;
border-radius: 4px; border-radius: 4px;
font-size: 0.7em; font-size: 0.7em;

View file

@ -2,6 +2,11 @@
@import 'variables.css'; @import 'variables.css';
:root {
/* Browser default font-size is 16px, this way 1 rem = 10px */
font-size: 62.5%;
}
html { html {
font-family: "Open Sans", sans-serif; font-family: "Open Sans", sans-serif;
color: var(--fg); color: var(--fg);
@ -11,39 +16,47 @@ html {
body { body {
margin: 0; margin: 0;
font-size: 1rem; font-size: 1.6rem;
overflow-x: hidden; overflow-x: hidden;
} }
code { code {
font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important;
font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */
} }
.left { float: left; } .left { float: left; }
.right { float: right; } .right { float: right; }
.boring { opacity: 0.6; }
.hide-boring .boring { display: none; }
.hidden { display: none; } .hidden { display: none; }
.play-button.hidden { display: none; }
h2, h3 { margin-top: 2.5em; } h2, h3 { margin-top: 2.5em; }
h4, h5 { margin-top: 2em; } h4, h5 { margin-top: 2em; }
.header + .header h3, .header + .header h3,
.header + .header h4, .header + .header h4,
.header + .header h5 { .header + .header h5 {
margin-top: 1em; margin-top: 1em;
} }
a.header:target h1:before, h1 a.header:target::before,
a.header:target h2:before, h2 a.header:target::before,
a.header:target h3:before, h3 a.header:target::before,
a.header:target h4:before { h4 a.header:target::before {
display: inline-block; display: inline-block;
content: "»"; content: "»";
margin-left: -30px; margin-left: -30px;
width: 30px; width: 30px;
} }
h1 a.header:target,
h2 a.header:target,
h3 a.header:target,
h4 a.header:target {
scroll-margin-top: calc(var(--menu-bar-height) + 0.5em);
}
.page { .page {
outline: 0; outline: 0;
padding: 0 var(--page-padding); padding: 0 var(--page-padding);
@ -51,7 +64,7 @@ a.header:target h4:before {
.page-wrapper { .page-wrapper {
box-sizing: border-box; box-sizing: border-box;
} }
.js .page-wrapper { .js:not(.sidebar-resizing) .page-wrapper {
transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */
} }
@ -92,6 +105,9 @@ table thead td {
font-weight: 700; font-weight: 700;
border: none; border: none;
} }
table thead th {
padding: 3px 20px;
}
table thead tr { table thead tr {
border: 1px var(--table-header-bg) solid; border: 1px var(--table-header-bg) solid;
} }
@ -141,4 +157,3 @@ blockquote {
.tooltipped .tooltiptext { .tooltipped .tooltiptext {
visibility: visible; visibility: visible;
} }

View file

@ -5,6 +5,7 @@
--sidebar-width: 300px; --sidebar-width: 300px;
--page-padding: 15px; --page-padding: 15px;
--content-max-width: 750px; --content-max-width: 750px;
--menu-bar-height: 50px;
} }
/* Themes */ /* Themes */
@ -208,3 +209,45 @@
--searchresults-li-bg: #dec2a2; --searchresults-li-bg: #dec2a2;
--search-mark-bg: #e69f67; --search-mark-bg: #e69f67;
} }
@media (prefers-color-scheme: dark) {
.light.no-js {
--bg: hsl(200, 7%, 8%);
--fg: #98a3ad;
--sidebar-bg: #292c2f;
--sidebar-fg: #a1adb8;
--sidebar-non-existant: #505254;
--sidebar-active: #3473ad;
--sidebar-spacer: #393939;
--scrollbar: var(--sidebar-fg);
--icons: #43484d;
--icons-hover: #b3c0cc;
--links: #2b79a2;
--inline-code-color: #c5c8c6;;
--theme-popup-bg: #141617;
--theme-popup-border: #43484d;
--theme-hover: #1f2124;
--quote-bg: hsl(234, 21%, 18%);
--quote-border: hsl(234, 21%, 23%);
--table-border-color: hsl(200, 7%, 13%);
--table-header-bg: hsl(200, 7%, 28%);
--table-alternate-bg: hsl(200, 7%, 11%);
--searchbar-border-color: #aaa;
--searchbar-bg: #b7b7b7;
--searchbar-fg: #000;
--searchbar-shadow-color: #aaa;
--searchresults-header-fg: #666;
--searchresults-border-color: #98a3ad;
--searchresults-li-bg: #2b2b2f;
--search-mark-bg: #355c7d;
}
}

View file

@ -1,9 +1,11 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js"> <html lang="en" class="sidebar-visible no-js light">
<head> <head>
<!-- Book generated using mdBook --> <!-- Book generated using mdBook -->
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>The End - chainerror</title> <title>The End - chainerror</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="A tutorial for the chainerror rust crate."> <meta name="description" content="A tutorial for the chainerror rust crate.">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@ -30,11 +32,11 @@
</head> </head>
<body class="light"> <body>
<!-- Provide site root to javascript --> <!-- Provide site root to javascript -->
<script type="text/javascript"> <script type="text/javascript">
var path_to_root = ""; var path_to_root = "";
var default_theme = "light"; var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
</script> </script>
<!-- Work around some values being stored in localStorage wrapped in quotes --> <!-- Work around some values being stored in localStorage wrapped in quotes -->
@ -56,10 +58,13 @@
<!-- Set the theme before any content is loaded, prevents flash --> <!-- Set the theme before any content is loaded, prevents flash -->
<script type="text/javascript"> <script type="text/javascript">
var theme; var theme;
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; }
document.body.className = theme; var html = document.querySelector('html');
document.querySelector('html').className = theme + ' js'; html.classList.remove('no-js')
html.classList.remove('light')
html.classList.add(theme);
html.classList.add('js');
</script> </script>
<!-- Hide / unhide sidebar before it is displayed --> <!-- Hide / unhide sidebar before it is displayed -->
@ -75,7 +80,10 @@
</script> </script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents"> <nav id="sidebar" class="sidebar" aria-label="Table of contents">
<ol class="chapter"><li class="affix"><a href="index.html">chainerror</a></li><li><a href="tutorial1.html"><strong aria-hidden="true">1.</strong> Simple String Errors</a></li><li><a href="tutorial2.html"><strong aria-hidden="true">2.</strong> Simple Chained String Errors</a></li><li><a href="tutorial3.html"><strong aria-hidden="true">3.</strong> Mapping Errors</a></li><li><a href="tutorial4.html"><strong aria-hidden="true">4.</strong> Saving coding chars</a></li><li><a href="tutorial5.html"><strong aria-hidden="true">5.</strong> The source() of Errors</a></li><li><a href="tutorial6.html"><strong aria-hidden="true">6.</strong> Downcast the Errors</a></li><li><a href="tutorial7.html"><strong aria-hidden="true">7.</strong> The root cause of all Errors</a></li><li><a href="tutorial8.html"><strong aria-hidden="true">8.</strong> Finding an Error cause</a></li><li><a href="tutorial9.html"><strong aria-hidden="true">9.</strong> Selective Error Handling</a></li><li><a href="tutorial10.html"><strong aria-hidden="true">10.</strong> ErrorKind to the rescue</a></li><li><a href="tutorial11.html"><strong aria-hidden="true">11.</strong> Debug for the ErrorKind</a></li><li><a href="tutorial12.html"><strong aria-hidden="true">12.</strong> Deref for the ErrorKind</a></li><li><a href="tutorial13.html"><strong aria-hidden="true">13.</strong> Writing a library</a></li><li class="affix"><a href="end.html" class="active">The End</a></li></ol> <div id="sidebar-scrollbox" class="sidebar-scrollbox">
<ol class="chapter"><li class="expanded affix "><a href="index.html">chainerror</a></li><li class="expanded "><a href="tutorial1.html"><strong aria-hidden="true">1.</strong> Simple String Errors</a></li><li class="expanded "><a href="tutorial2.html"><strong aria-hidden="true">2.</strong> Simple Chained String Errors</a></li><li class="expanded "><a href="tutorial3.html"><strong aria-hidden="true">3.</strong> Mapping Errors</a></li><li class="expanded "><a href="tutorial4.html"><strong aria-hidden="true">4.</strong> Saving coding chars</a></li><li class="expanded "><a href="tutorial5.html"><strong aria-hidden="true">5.</strong> The source() of Errors</a></li><li class="expanded "><a href="tutorial6.html"><strong aria-hidden="true">6.</strong> Downcast the Errors</a></li><li class="expanded "><a href="tutorial7.html"><strong aria-hidden="true">7.</strong> The root cause of all Errors</a></li><li class="expanded "><a href="tutorial8.html"><strong aria-hidden="true">8.</strong> Finding an Error cause</a></li><li class="expanded "><a href="tutorial9.html"><strong aria-hidden="true">9.</strong> Selective Error Handling</a></li><li class="expanded "><a href="tutorial10.html"><strong aria-hidden="true">10.</strong> ErrorKind to the rescue</a></li><li class="expanded "><a href="tutorial11.html"><strong aria-hidden="true">11.</strong> Debug for the ErrorKind</a></li><li class="expanded "><a href="tutorial12.html"><strong aria-hidden="true">12.</strong> Deref for the ErrorKind</a></li><li class="expanded "><a href="tutorial13.html"><strong aria-hidden="true">13.</strong> Writing a library</a></li><li class="expanded "><a href="tutorial14.html"><strong aria-hidden="true">14.</strong> Going back to std</a></li><li class="expanded affix "><a href="end.html" class="active">The End</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav> </nav>
<div id="page-wrapper" class="page-wrapper"> <div id="page-wrapper" class="page-wrapper">
@ -105,7 +113,7 @@
</div> </div>
<h1 class="menu-title">chainerror</h1> <h1 class="menu-title">chainerror</h1>
<div class="right-buttons"> <div class="right-buttons">
<a href="print.html" title="Print this book" aria-label="Print this book"> <a href="print.html" title="Print this book" aria-label="Print this book">
@ -140,7 +148,7 @@
<div id="content" class="content"> <div id="content" class="content">
<main> <main>
<a class="header" href="#the-end" id="the-end"><h1>The End</h1></a> <h1><a class="header" href="#the-end" id="the-end">The End</a></h1>
<p>That's it for now…</p> <p>That's it for now…</p>
<p>Happy error handling!</p> <p>Happy error handling!</p>
<p>To report issues, submit pull request or for the source code, examples and the book source, visit <p>To report issues, submit pull request or for the source code, examples and the book source, visit
@ -151,7 +159,7 @@ the <a href="https://github.com/haraldh/chainerror">Git Repo</a>.</p>
<nav class="nav-wrapper" aria-label="Page navigation"> <nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons --> <!-- Mobile navigation buttons -->
<a rel="prev" href="tutorial13.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> <a rel="prev" href="tutorial14.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i> <i class="fa fa-angle-left"></i>
</a> </a>
@ -165,7 +173,7 @@ the <a href="https://github.com/haraldh/chainerror">Git Repo</a>.</p>
<nav class="nav-wide-wrapper" aria-label="Page navigation"> <nav class="nav-wide-wrapper" aria-label="Page navigation">
<a href="tutorial13.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> <a href="tutorial14.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i> <i class="fa fa-angle-left"></i>
</a> </a>
@ -180,6 +188,14 @@ the <a href="https://github.com/haraldh/chainerror">Git Repo</a>.</p>
<script type="text/javascript">
window.playpen_copyable = true;
</script>
<script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> <script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>

View file

@ -67,3 +67,13 @@
.hljs-strong { .hljs-strong {
font-weight: bold; font-weight: bold;
} }
.hljs-addition {
color: #22863a;
background-color: #f0fff4;
}
.hljs-deletion {
color: #b31d28;
background-color: #ffeef0;
}

File diff suppressed because one or more lines are too long

View file

@ -1,9 +1,11 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js"> <html lang="en" class="sidebar-visible no-js light">
<head> <head>
<!-- Book generated using mdBook --> <!-- Book generated using mdBook -->
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>chainerror - chainerror</title> <title>chainerror - chainerror</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="A tutorial for the chainerror rust crate."> <meta name="description" content="A tutorial for the chainerror rust crate.">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@ -30,11 +32,11 @@
</head> </head>
<body class="light"> <body>
<!-- Provide site root to javascript --> <!-- Provide site root to javascript -->
<script type="text/javascript"> <script type="text/javascript">
var path_to_root = ""; var path_to_root = "";
var default_theme = "light"; var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
</script> </script>
<!-- Work around some values being stored in localStorage wrapped in quotes --> <!-- Work around some values being stored in localStorage wrapped in quotes -->
@ -56,10 +58,13 @@
<!-- Set the theme before any content is loaded, prevents flash --> <!-- Set the theme before any content is loaded, prevents flash -->
<script type="text/javascript"> <script type="text/javascript">
var theme; var theme;
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; }
document.body.className = theme; var html = document.querySelector('html');
document.querySelector('html').className = theme + ' js'; html.classList.remove('no-js')
html.classList.remove('light')
html.classList.add(theme);
html.classList.add('js');
</script> </script>
<!-- Hide / unhide sidebar before it is displayed --> <!-- Hide / unhide sidebar before it is displayed -->
@ -75,7 +80,10 @@
</script> </script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents"> <nav id="sidebar" class="sidebar" aria-label="Table of contents">
<ol class="chapter"><li class="affix"><a href="index.html">chainerror</a></li><li><a href="tutorial1.html"><strong aria-hidden="true">1.</strong> Simple String Errors</a></li><li><a href="tutorial2.html"><strong aria-hidden="true">2.</strong> Simple Chained String Errors</a></li><li><a href="tutorial3.html"><strong aria-hidden="true">3.</strong> Mapping Errors</a></li><li><a href="tutorial4.html"><strong aria-hidden="true">4.</strong> Saving coding chars</a></li><li><a href="tutorial5.html"><strong aria-hidden="true">5.</strong> The source() of Errors</a></li><li><a href="tutorial6.html"><strong aria-hidden="true">6.</strong> Downcast the Errors</a></li><li><a href="tutorial7.html"><strong aria-hidden="true">7.</strong> The root cause of all Errors</a></li><li><a href="tutorial8.html"><strong aria-hidden="true">8.</strong> Finding an Error cause</a></li><li><a href="tutorial9.html"><strong aria-hidden="true">9.</strong> Selective Error Handling</a></li><li><a href="tutorial10.html"><strong aria-hidden="true">10.</strong> ErrorKind to the rescue</a></li><li><a href="tutorial11.html"><strong aria-hidden="true">11.</strong> Debug for the ErrorKind</a></li><li><a href="tutorial12.html"><strong aria-hidden="true">12.</strong> Deref for the ErrorKind</a></li><li><a href="tutorial13.html"><strong aria-hidden="true">13.</strong> Writing a library</a></li><li class="affix"><a href="end.html">The End</a></li></ol> <div id="sidebar-scrollbox" class="sidebar-scrollbox">
<ol class="chapter"><li class="expanded affix "><a href="index.html" class="active">chainerror</a></li><li class="expanded "><a href="tutorial1.html"><strong aria-hidden="true">1.</strong> Simple String Errors</a></li><li class="expanded "><a href="tutorial2.html"><strong aria-hidden="true">2.</strong> Simple Chained String Errors</a></li><li class="expanded "><a href="tutorial3.html"><strong aria-hidden="true">3.</strong> Mapping Errors</a></li><li class="expanded "><a href="tutorial4.html"><strong aria-hidden="true">4.</strong> Saving coding chars</a></li><li class="expanded "><a href="tutorial5.html"><strong aria-hidden="true">5.</strong> The source() of Errors</a></li><li class="expanded "><a href="tutorial6.html"><strong aria-hidden="true">6.</strong> Downcast the Errors</a></li><li class="expanded "><a href="tutorial7.html"><strong aria-hidden="true">7.</strong> The root cause of all Errors</a></li><li class="expanded "><a href="tutorial8.html"><strong aria-hidden="true">8.</strong> Finding an Error cause</a></li><li class="expanded "><a href="tutorial9.html"><strong aria-hidden="true">9.</strong> Selective Error Handling</a></li><li class="expanded "><a href="tutorial10.html"><strong aria-hidden="true">10.</strong> ErrorKind to the rescue</a></li><li class="expanded "><a href="tutorial11.html"><strong aria-hidden="true">11.</strong> Debug for the ErrorKind</a></li><li class="expanded "><a href="tutorial12.html"><strong aria-hidden="true">12.</strong> Deref for the ErrorKind</a></li><li class="expanded "><a href="tutorial13.html"><strong aria-hidden="true">13.</strong> Writing a library</a></li><li class="expanded "><a href="tutorial14.html"><strong aria-hidden="true">14.</strong> Going back to std</a></li><li class="expanded affix "><a href="end.html">The End</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav> </nav>
<div id="page-wrapper" class="page-wrapper"> <div id="page-wrapper" class="page-wrapper">
@ -105,7 +113,7 @@
</div> </div>
<h1 class="menu-title">chainerror</h1> <h1 class="menu-title">chainerror</h1>
<div class="right-buttons"> <div class="right-buttons">
<a href="print.html" title="Print this book" aria-label="Print this book"> <a href="print.html" title="Print this book" aria-label="Print this book">
@ -140,7 +148,7 @@
<div id="content" class="content"> <div id="content" class="content">
<main> <main>
<a class="header" href="#chainerror" id="chainerror"><h1>chainerror</h1></a> <h1><a class="header" href="#chainerror" id="chainerror">chainerror</a></h1>
<p><a href="https://travis-ci.org/haraldh/chainerror"><img src="https://travis-ci.org/haraldh/chainerror.svg?branch=master" alt="Build Status" /></a> <p><a href="https://travis-ci.org/haraldh/chainerror"><img src="https://travis-ci.org/haraldh/chainerror.svg?branch=master" alt="Build Status" /></a>
<a href="https://crates.io/crates/chainerror"><img src="https://img.shields.io/crates/v/chainerror.svg" alt="Crate" /></a> <a href="https://crates.io/crates/chainerror"><img src="https://img.shields.io/crates/v/chainerror.svg" alt="Crate" /></a>
<a href="https://docs.rs/chainerror/"><img src="https://img.shields.io/badge/api-rustdoc-blue.svg" alt="Rust Documentation" /></a></p> <a href="https://docs.rs/chainerror/"><img src="https://img.shields.io/badge/api-rustdoc-blue.svg" alt="Rust Documentation" /></a></p>
@ -153,7 +161,7 @@ It encapsulates all types, which have <code>Display + Debug</code> and can store
<p>Debug information is worth it!</p> <p>Debug information is worth it!</p>
<p>Now continue reading the <p>Now continue reading the
<a href="https://haraldh.github.io/chainerror/tutorial1.html">Tutorial</a></p> <a href="https://haraldh.github.io/chainerror/tutorial1.html">Tutorial</a></p>
<a class="header" href="#example" id="example"><h2>Example:</h2></a> <h2><a class="header" href="#example" id="example">Example:</a></h2>
<p>Output:</p> <p>Output:</p>
<pre><code>$ cargo run -q --example example <pre><code>$ cargo run -q --example example
Main Error Report: func1 error calling func2 Main Error Report: func1 error calling func2
@ -178,12 +186,12 @@ use std::error::Error;
use std::io; use std::io;
use std::result::Result; use std::result::Result;
fn do_some_io() -&gt; Result&lt;(), Box&lt;Error&gt;&gt; { fn do_some_io() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; {
Err(io::Error::from(io::ErrorKind::NotFound))?; Err(io::Error::from(io::ErrorKind::NotFound))?;
Ok(()) Ok(())
} }
fn func3() -&gt; Result&lt;(), Box&lt;Error&gt;&gt; { fn func3() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; {
let filename = &quot;foo.txt&quot;; let filename = &quot;foo.txt&quot;;
do_some_io().map_err(mstrerr!(&quot;Error reading '{}'&quot;, filename))?; do_some_io().map_err(mstrerr!(&quot;Error reading '{}'&quot;, filename))?;
Ok(()) Ok(())
@ -246,7 +254,7 @@ fn main() {
} }
</code></pre> </code></pre>
<a class="header" href="#features" id="features"><h2>Features</h2></a> <h2><a class="header" href="#features" id="features">Features</a></h2>
<p><code>no-fileline</code> <p><code>no-fileline</code>
: completely turn off storing filename and line</p> : completely turn off storing filename and line</p>
<p><code>display-cause</code> <p><code>display-cause</code>
@ -261,6 +269,10 @@ fn main() {
<a rel="next" href="tutorial1.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div> <div style="clear: both"></div>
</nav> </nav>
@ -271,6 +283,10 @@ fn main() {
<a href="tutorial1.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav> </nav>
</div> </div>
@ -280,6 +296,14 @@ fn main() {
<script type="text/javascript">
window.playpen_copyable = true;
</script>
<script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> <script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>

11600
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

View file

@ -94,3 +94,11 @@
.xml .hljs-cdata { .xml .hljs-cdata {
opacity: 0.5; opacity: 0.5;
} }
.hljs-addition {
color: #718c00;
}
.hljs-deletion {
color: #c82829;
}

View file

@ -1,9 +1,11 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js"> <html lang="en" class="sidebar-visible no-js light">
<head> <head>
<!-- Book generated using mdBook --> <!-- Book generated using mdBook -->
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Simple String Errors - chainerror</title> <title>Simple String Errors - chainerror</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="A tutorial for the chainerror rust crate."> <meta name="description" content="A tutorial for the chainerror rust crate.">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@ -30,11 +32,11 @@
</head> </head>
<body class="light"> <body>
<!-- Provide site root to javascript --> <!-- Provide site root to javascript -->
<script type="text/javascript"> <script type="text/javascript">
var path_to_root = ""; var path_to_root = "";
var default_theme = "light"; var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
</script> </script>
<!-- Work around some values being stored in localStorage wrapped in quotes --> <!-- Work around some values being stored in localStorage wrapped in quotes -->
@ -56,10 +58,13 @@
<!-- Set the theme before any content is loaded, prevents flash --> <!-- Set the theme before any content is loaded, prevents flash -->
<script type="text/javascript"> <script type="text/javascript">
var theme; var theme;
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; }
document.body.className = theme; var html = document.querySelector('html');
document.querySelector('html').className = theme + ' js'; html.classList.remove('no-js')
html.classList.remove('light')
html.classList.add(theme);
html.classList.add('js');
</script> </script>
<!-- Hide / unhide sidebar before it is displayed --> <!-- Hide / unhide sidebar before it is displayed -->
@ -75,7 +80,10 @@
</script> </script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents"> <nav id="sidebar" class="sidebar" aria-label="Table of contents">
<ol class="chapter"><li class="affix"><a href="index.html">chainerror</a></li><li><a href="tutorial1.html" class="active"><strong aria-hidden="true">1.</strong> Simple String Errors</a></li><li><a href="tutorial2.html"><strong aria-hidden="true">2.</strong> Simple Chained String Errors</a></li><li><a href="tutorial3.html"><strong aria-hidden="true">3.</strong> Mapping Errors</a></li><li><a href="tutorial4.html"><strong aria-hidden="true">4.</strong> Saving coding chars</a></li><li><a href="tutorial5.html"><strong aria-hidden="true">5.</strong> The source() of Errors</a></li><li><a href="tutorial6.html"><strong aria-hidden="true">6.</strong> Downcast the Errors</a></li><li><a href="tutorial7.html"><strong aria-hidden="true">7.</strong> The root cause of all Errors</a></li><li><a href="tutorial8.html"><strong aria-hidden="true">8.</strong> Finding an Error cause</a></li><li><a href="tutorial9.html"><strong aria-hidden="true">9.</strong> Selective Error Handling</a></li><li><a href="tutorial10.html"><strong aria-hidden="true">10.</strong> ErrorKind to the rescue</a></li><li><a href="tutorial11.html"><strong aria-hidden="true">11.</strong> Debug for the ErrorKind</a></li><li><a href="tutorial12.html"><strong aria-hidden="true">12.</strong> Deref for the ErrorKind</a></li><li><a href="tutorial13.html"><strong aria-hidden="true">13.</strong> Writing a library</a></li><li class="affix"><a href="end.html">The End</a></li></ol> <div id="sidebar-scrollbox" class="sidebar-scrollbox">
<ol class="chapter"><li class="expanded affix "><a href="index.html">chainerror</a></li><li class="expanded "><a href="tutorial1.html" class="active"><strong aria-hidden="true">1.</strong> Simple String Errors</a></li><li class="expanded "><a href="tutorial2.html"><strong aria-hidden="true">2.</strong> Simple Chained String Errors</a></li><li class="expanded "><a href="tutorial3.html"><strong aria-hidden="true">3.</strong> Mapping Errors</a></li><li class="expanded "><a href="tutorial4.html"><strong aria-hidden="true">4.</strong> Saving coding chars</a></li><li class="expanded "><a href="tutorial5.html"><strong aria-hidden="true">5.</strong> The source() of Errors</a></li><li class="expanded "><a href="tutorial6.html"><strong aria-hidden="true">6.</strong> Downcast the Errors</a></li><li class="expanded "><a href="tutorial7.html"><strong aria-hidden="true">7.</strong> The root cause of all Errors</a></li><li class="expanded "><a href="tutorial8.html"><strong aria-hidden="true">8.</strong> Finding an Error cause</a></li><li class="expanded "><a href="tutorial9.html"><strong aria-hidden="true">9.</strong> Selective Error Handling</a></li><li class="expanded "><a href="tutorial10.html"><strong aria-hidden="true">10.</strong> ErrorKind to the rescue</a></li><li class="expanded "><a href="tutorial11.html"><strong aria-hidden="true">11.</strong> Debug for the ErrorKind</a></li><li class="expanded "><a href="tutorial12.html"><strong aria-hidden="true">12.</strong> Deref for the ErrorKind</a></li><li class="expanded "><a href="tutorial13.html"><strong aria-hidden="true">13.</strong> Writing a library</a></li><li class="expanded "><a href="tutorial14.html"><strong aria-hidden="true">14.</strong> Going back to std</a></li><li class="expanded affix "><a href="end.html">The End</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav> </nav>
<div id="page-wrapper" class="page-wrapper"> <div id="page-wrapper" class="page-wrapper">
@ -105,7 +113,7 @@
</div> </div>
<h1 class="menu-title">chainerror</h1> <h1 class="menu-title">chainerror</h1>
<div class="right-buttons"> <div class="right-buttons">
<a href="print.html" title="Print this book" aria-label="Print this book"> <a href="print.html" title="Print this book" aria-label="Print this book">
@ -140,17 +148,17 @@
<div id="content" class="content"> <div id="content" class="content">
<main> <main>
<a class="header" href="#simple-string-errors" id="simple-string-errors"><h1>Simple String Errors</h1></a> <h1><a class="header" href="#simple-string-errors" id="simple-string-errors">Simple String Errors</a></h1>
<p>An easy way of doing error handling in rust is by returning <code>String</code> as a <code>Box&lt;std::error::Error&gt;</code>.</p> <p>An easy way of doing error handling in rust is by returning <code>String</code> as a <code>Box&lt;std::error::Error&gt;</code>.</p>
<p>If the rust <code>main</code> function returns an <code>Err()</code>, this <code>Err()</code> will be displayed with <code>std::fmt::Debug</code>.</p> <p>If the rust <code>main</code> function returns an <code>Err()</code>, this <code>Err()</code> will be displayed with <code>std::fmt::Debug</code>.</p>
<p>As you can see by running the example (by pressing the &quot;Play&quot; button in upper right of the code block), <p>As you can see by running the example (by pressing the &quot;Play&quot; button in upper right of the code block),
this only this only
prints out the last <code>Error</code>.</p> prints out the last <code>Error</code>.</p>
<pre><code>Error: StringError(&quot;func1 error&quot;) <pre><code>Error: StringError(&quot;func1 error&quot;)
</code></pre> </code></pre>
<p>The next chapters of this tutorial show how <code>chainerror</code> adds more information <p>The next chapters of this tutorial show how <code>chainerror</code> adds more information
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>$ cargo run -q --example tutorial1
</code></pre> </code></pre>
@ -158,29 +166,28 @@ and improves inspecting the sources of an error.</p>
use std::io; use std::io;
use std::result::Result; use std::result::Result;
fn do_some_io() -&gt; Result&lt;(), Box&lt;Error&gt;&gt; { fn do_some_io() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; {
Err(io::Error::from(io::ErrorKind::NotFound))?; Err(io::Error::from(io::ErrorKind::NotFound))?;
Ok(()) Ok(())
} }
fn func2() -&gt; Result&lt;(), Box&lt;Error&gt;&gt; { fn func2() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; {
if let Err(_) = do_some_io() { if let Err(_) = do_some_io() {
Err(&quot;func2 error&quot;)?; Err(&quot;func2 error&quot;)?;
} }
Ok(()) Ok(())
} }
fn func1() -&gt; Result&lt;(), Box&lt;Error&gt;&gt; { fn func1() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; {
if let Err(_) = func2() { if let Err(_) = func2() {
Err(&quot;func1 error&quot;)?; Err(&quot;func1 error&quot;)?;
} }
Ok(()) Ok(())
} }
fn main() -&gt; Result&lt;(), Box&lt;Error&gt;&gt; { fn main() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; {
func1() func1()
} }
</code></pre></pre> </code></pre></pre>
</main> </main>
@ -225,6 +232,14 @@ fn main() -&gt; Result&lt;(), Box&lt;Error&gt;&gt; {
<script type="text/javascript">
window.playpen_copyable = true;
</script>
<script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script> <script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

440
tutorial14.html Normal file
View file

@ -0,0 +1,440 @@
<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js light">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>Going back to std - chainerror</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="A tutorial for the chainerror rust crate.">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff" />
<link rel="shortcut icon" href="favicon.png">
<link rel="stylesheet" href="css/variables.css">
<link rel="stylesheet" href="css/general.css">
<link rel="stylesheet" href="css/chrome.css">
<link rel="stylesheet" href="css/print.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:500" rel="stylesheet" type="text/css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" href="highlight.css">
<link rel="stylesheet" href="tomorrow-night.css">
<link rel="stylesheet" href="ayu-highlight.css">
<!-- Custom theme stylesheets -->
</head>
<body>
<!-- Provide site root to javascript -->
<script type="text/javascript">
var path_to_root = "";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
</script>
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script type="text/javascript">
try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script type="text/javascript">
var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('no-js')
html.classList.remove('light')
html.classList.add(theme);
html.classList.add('js');
</script>
<!-- Hide / unhide sidebar before it is displayed -->
<script type="text/javascript">
var html = document.querySelector('html');
var sidebar = 'hidden';
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
}
html.classList.remove('sidebar-visible');
html.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div id="sidebar-scrollbox" class="sidebar-scrollbox">
<ol class="chapter"><li class="expanded affix "><a href="index.html">chainerror</a></li><li class="expanded "><a href="tutorial1.html"><strong aria-hidden="true">1.</strong> Simple String Errors</a></li><li class="expanded "><a href="tutorial2.html"><strong aria-hidden="true">2.</strong> Simple Chained String Errors</a></li><li class="expanded "><a href="tutorial3.html"><strong aria-hidden="true">3.</strong> Mapping Errors</a></li><li class="expanded "><a href="tutorial4.html"><strong aria-hidden="true">4.</strong> Saving coding chars</a></li><li class="expanded "><a href="tutorial5.html"><strong aria-hidden="true">5.</strong> The source() of Errors</a></li><li class="expanded "><a href="tutorial6.html"><strong aria-hidden="true">6.</strong> Downcast the Errors</a></li><li class="expanded "><a href="tutorial7.html"><strong aria-hidden="true">7.</strong> The root cause of all Errors</a></li><li class="expanded "><a href="tutorial8.html"><strong aria-hidden="true">8.</strong> Finding an Error cause</a></li><li class="expanded "><a href="tutorial9.html"><strong aria-hidden="true">9.</strong> Selective Error Handling</a></li><li class="expanded "><a href="tutorial10.html"><strong aria-hidden="true">10.</strong> ErrorKind to the rescue</a></li><li class="expanded "><a href="tutorial11.html"><strong aria-hidden="true">11.</strong> Debug for the ErrorKind</a></li><li class="expanded "><a href="tutorial12.html"><strong aria-hidden="true">12.</strong> Deref for the ErrorKind</a></li><li class="expanded "><a href="tutorial13.html"><strong aria-hidden="true">13.</strong> Writing a library</a></li><li class="expanded "><a href="tutorial14.html" class="active"><strong aria-hidden="true">14.</strong> Going back to std</a></li><li class="expanded affix "><a href="end.html">The End</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
</nav>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar" class="menu-bar">
<div id="menu-bar-sticky-container">
<div class="left-buttons">
<button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</button>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li>
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
</ul>
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
<i class="fa fa-search"></i>
</button>
</div>
<h1 class="menu-title">chainerror</h1>
<div class="right-buttons">
<a href="print.html" title="Print this book" aria-label="Print this book">
<i id="print-button" class="fa fa-print"></i>
</a>
</div>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input type="search" name="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults">
</ul>
</div>
</div>
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
<script type="text/javascript">
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
</script>
<div id="content" class="content">
<main>
<h1><a class="header" href="#going-back-to-std" id="going-back-to-std">Going back to std</a></h1>
<p>Not using <code>chainerror</code> and going full <code>std</code> would look like this:</p>
<p>Btw, the code size is bigger than using <code>chainerror</code> :-)</p>
<pre><pre class="playpen"><code class="language-rust">pub mod mycrate {
use std::error::Error as StdError;
use func2mod::{do_some_io, func2};
pub mod func2mod {
use std::error::Error as StdError;
use std::io;
pub enum ErrorKind {
IO(String),
}
impl std::fmt::Display for ErrorKind {
fn fmt(&amp;self, f: &amp;mut ::std::fmt::Formatter) -&gt; std::fmt::Result {
match self {
ErrorKind::IO(s) =&gt; std::fmt::Display::fmt(s, f),
}
}
}
impl std::fmt::Debug for ErrorKind {
fn fmt(&amp;self, f: &amp;mut ::std::fmt::Formatter) -&gt; std::fmt::Result {
match self {
ErrorKind::IO(s) =&gt; std::fmt::Display::fmt(s, f),
}
}
}
macro_rules! mcherr {
( $k:expr ) =&gt; {{
|e| {
Error(
$k,
Some(Box::from(e)),
Some(concat!(file!(), &quot;:&quot;, line!(), &quot;: &quot;)),
)
}
}};
}
pub struct Error(
ErrorKind,
Option&lt;Box&lt;dyn std::error::Error + 'static&gt;&gt;,
Option&lt;&amp;'static str&gt;,
);
impl Error {
pub fn kind(&amp;self) -&gt; &amp;ErrorKind {
&amp;self.0
}
}
impl From&lt;ErrorKind&gt; for Error {
fn from(e: ErrorKind) -&gt; Self {
Error(e, None, None)
}
}
impl std::error::Error for Error {
fn source(&amp;self) -&gt; Option&lt;&amp;(dyn std::error::Error + 'static)&gt; {
self.1.as_ref().map(|e| e.as_ref())
}
}
impl std::fmt::Display for Error {
fn fmt(&amp;self, f: &amp;mut std::fmt::Formatter) -&gt; std::fmt::Result {
std::fmt::Display::fmt(&amp;self.0, f)
}
}
impl std::fmt::Debug for Error {
fn fmt(&amp;self, f: &amp;mut std::fmt::Formatter) -&gt; std::fmt::Result {
if let Some(ref o) = self.2 {
std::fmt::Display::fmt(o, f)?;
}
std::fmt::Debug::fmt(&amp;self.0, f)?;
if let Some(e) = self.source() {
std::fmt::Display::fmt(&quot;\nCaused by:\n&quot;, f)?;
std::fmt::Debug::fmt(&amp;e, f)?;
}
Ok(())
}
}
pub fn do_some_io() -&gt; std::result::Result&lt;(), Box&lt;dyn std::error::Error&gt;&gt; {
Err(io::Error::from(io::ErrorKind::NotFound))?;
Ok(())
}
pub fn func2() -&gt; std::result::Result&lt;(), Error&gt; {
let filename = &quot;foo.txt&quot;;
do_some_io().map_err(mcherr!(ErrorKind::IO(format!(
&quot;Error reading '{}'&quot;,
filename
))))?;
Ok(())
}
}
#[derive(Debug)]
pub enum ErrorKind {
Func2,
IO(String),
}
impl std::fmt::Display for ErrorKind {
fn fmt(&amp;self, f: &amp;mut ::std::fmt::Formatter) -&gt; std::fmt::Result {
match self {
ErrorKind::Func2 =&gt; write!(f, &quot;func1 error calling func2&quot;),
ErrorKind::IO(filename) =&gt; write!(f, &quot;Error reading '{}'&quot;, filename),
}
}
}
macro_rules! mcherr {
( $k:expr ) =&gt; {{
|e| {
Error(
$k,
Some(Box::from(e)),
Some(concat!(file!(), &quot;:&quot;, line!(), &quot;: &quot;)),
)
}
}};
}
pub struct Error(
ErrorKind,
Option&lt;Box&lt;dyn std::error::Error + 'static&gt;&gt;,
Option&lt;&amp;'static str&gt;,
);
impl Error {
pub fn kind(&amp;self) -&gt; &amp;ErrorKind {
&amp;self.0
}
}
impl From&lt;ErrorKind&gt; for Error {
fn from(e: ErrorKind) -&gt; Self {
Error(e, None, None)
}
}
impl std::error::Error for Error {
fn source(&amp;self) -&gt; Option&lt;&amp;(dyn std::error::Error + 'static)&gt; {
self.1.as_ref().map(|e| e.as_ref())
}
}
impl std::fmt::Display for Error {
fn fmt(&amp;self, f: &amp;mut std::fmt::Formatter) -&gt; std::fmt::Result {
std::fmt::Display::fmt(&amp;self.0, f)
}
}
impl std::fmt::Debug for Error {
fn fmt(&amp;self, f: &amp;mut std::fmt::Formatter) -&gt; std::fmt::Result {
if let Some(ref o) = self.2 {
std::fmt::Display::fmt(o, f)?;
}
std::fmt::Debug::fmt(&amp;self.0, f)?;
if let Some(e) = self.source() {
std::fmt::Display::fmt(&quot;\nCaused by:\n&quot;, f)?;
std::fmt::Debug::fmt(&amp;e, f)?;
}
Ok(())
}
}
pub type Result&lt;T&gt; = std::result::Result&lt;T, Error&gt;;
pub fn func1() -&gt; Result&lt;()&gt; {
func2().map_err(mcherr!(ErrorKind::Func2))?;
let filename = String::from(&quot;bar.txt&quot;);
do_some_io().map_err(mcherr!(ErrorKind::IO(filename)))?;
Ok(())
}
}
fn main() -&gt; Result&lt;(), Box&lt;std::error::Error + Send + Sync&gt;&gt; {
use mycrate::func1;
use mycrate::ErrorKind;
use std::error::Error;
use std::io;
if let Err(e) = func1() {
match e.kind() {
ErrorKind::Func2 =&gt; eprintln!(&quot;Main Error Report: func1 error calling func2&quot;),
ErrorKind::IO(ref filename) =&gt; {
eprintln!(&quot;Main Error Report: func1 error reading '{}'&quot;, filename)
}
}
eprintln!();
let mut s: &amp;Error = &amp;e;
while let Some(c) = s.source() {
if let Some(ioerror) = c.downcast_ref::&lt;io::Error&gt;() {
eprintln!(&quot;caused by: std::io::Error: {}&quot;, ioerror);
match ioerror.kind() {
io::ErrorKind::NotFound =&gt; eprintln!(&quot;of kind: std::io::ErrorKind::NotFound&quot;),
_ =&gt; {}
}
} else {
eprintln!(&quot;caused by: {}&quot;, c);
}
s = c;
}
eprintln!(&quot;\nDebug Error:\n{:?}&quot;, e);
}
Ok(())
}
</code></pre></pre>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="tutorial13.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next" href="end.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a href="tutorial13.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a href="end.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
</div>
<script type="text/javascript">
window.playpen_copyable = true;
</script>
<script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
<script src="mark.min.js" type="text/javascript" charset="utf-8"></script>
<script src="searcher.js" type="text/javascript" charset="utf-8"></script>
<script src="clipboard.min.js" type="text/javascript" charset="utf-8"></script>
<script src="highlight.js" type="text/javascript" charset="utf-8"></script>
<script src="book.js" type="text/javascript" charset="utf-8"></script>
<!-- Custom JS scripts -->
</body>
</html>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff