├── .gitignore ├── CNAME ├── content ├── _index.md ├── curators.md ├── topics │ ├── _index.md │ ├── nodejs.md │ ├── binary-protocols.md │ ├── wasm-runtimes.md │ ├── logging.md │ ├── asyncio.md │ ├── http-clients.md │ ├── compression.md │ ├── syndication.md │ ├── utils.md │ ├── testing.md │ ├── email.md │ ├── encoding.md │ ├── serializer.md │ ├── templating.md │ ├── browser.md │ ├── web-apis.md │ ├── i18n.md │ ├── auth.md │ ├── lower-web-stack.md │ ├── webassembly.md │ ├── frameworks.md │ ├── database.md │ ├── services.md │ ├── cms.md │ ├── crypto.md │ └── deploy.md ├── news │ ├── _index.md │ ├── 2015-05-11-kafka-client-for-rust.md │ ├── 2016-02-09-pwhash-a-password-hashing-verification-library.md │ ├── 2015-05-08-rustful-0-1-0-is-now-available-on-crates-io.md │ ├── 2015-07-30-treasure_orm_progress_query_api_just_grammar_docs.md │ ├── 2015-07-26-treasure_orm_initial_design_with_small_working.md │ ├── 2015-12-03-kinglet-an-asynchronous-http-server.md │ ├── 2016-02-01-handlebars_templating_libraries_now_works_with.md │ ├── 2016-01-11-dbmigrate-a-sql-migration-tool.md │ ├── 2015-06-23-herd-a-http-load-testing-application-written-in-rust.md │ ├── 2015-11-29-announcing-diesel-a-safe-extensible-orm-and-query-builder-for-rust.md │ ├── 2016-01-18-basic-http-server-a-simple-http-file-server-built-on-rotor.md │ ├── 2015-06-25-hyper-v0-6.md │ ├── 2017-08-11-announcing-gotham.md │ ├── 2014-06-04-7-high-priority-rust-libraries-that-need-to-be-written.md │ ├── 2016-02-16-we-are-back-baby.md │ ├── 2016-03-08-introducing-pencil.md │ ├── 2016-03-14-RustWebDigest-1-Getting-Started-Servo.md │ ├── 2016-11-20-RustWebDigest-4-i-wish-there-was-async-but-at-least-we-got-cms.md │ ├── 2016-07-24-RustWebDigest-3-Authentication-Rest-and-more-learning.md │ └── 2016-05-25-RustWebDigest-2-Learn-More-With-Blogs-And-Events.md └── about.md ├── static ├── rust.png ├── favicon.ico ├── screenshot.png ├── about │ ├── comments.png │ ├── package-info.png │ └── comments-shown.png ├── fonts │ ├── FiraSans-Light.woff │ ├── FiraSans-Medium.woff │ ├── FiraSans-Regular.woff │ └── LICENSE └── gh-fork-ribbon.css ├── templates ├── shortcodes │ ├── level.html │ └── packages.html ├── macros │ ├── news_item.html │ ├── packages.html │ ├── level.html │ ├── author.html │ └── package.html ├── page.html ├── topics.html ├── news.html ├── curators.html ├── news-page.html ├── topic-page.html ├── base.html └── home.html ├── sass ├── styles │ ├── links.scss │ ├── _breakpoints.scss │ ├── topic.scss │ ├── fonts.scss │ ├── level-indicator.scss │ ├── home.scss │ ├── news.scss │ ├── core.scss │ ├── _font-mixins.scss │ ├── base.scss │ ├── authors.scss │ ├── footer.scss │ └── pkg.scss └── styles.scss ├── config.toml ├── .github └── workflows │ └── zola.yml ├── scripts ├── update_crates.sh ├── import_dc.sh ├── import_reddit.sh └── JSON.sh ├── authors.toml ├── README.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | public/ -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | www.arewewebyet.org 2 | -------------------------------------------------------------------------------- /content/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | template = "home.html" 3 | +++ -------------------------------------------------------------------------------- /static/rust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/rust.png -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /content/curators.md: -------------------------------------------------------------------------------- 1 | +++ 2 | template = "curators.html" 3 | title = "Curators" 4 | +++ 5 | 6 | -------------------------------------------------------------------------------- /static/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/screenshot.png -------------------------------------------------------------------------------- /static/about/comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/about/comments.png -------------------------------------------------------------------------------- /templates/shortcodes/level.html: -------------------------------------------------------------------------------- 1 | {% import "macros/level.html" as level %} {{ level::level(level=level) }} 2 | -------------------------------------------------------------------------------- /sass/styles/links.scss: -------------------------------------------------------------------------------- 1 | a, a:visited { 2 | color: #428bca; 3 | } 4 | 5 | a:hover { 6 | color: #3276b1; 7 | } 8 | -------------------------------------------------------------------------------- /static/about/package-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/about/package-info.png -------------------------------------------------------------------------------- /static/about/comments-shown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/about/comments-shown.png -------------------------------------------------------------------------------- /static/fonts/FiraSans-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/fonts/FiraSans-Light.woff -------------------------------------------------------------------------------- /static/fonts/FiraSans-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/fonts/FiraSans-Medium.woff -------------------------------------------------------------------------------- /static/fonts/FiraSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rust-lang/arewewebyet/HEAD/static/fonts/FiraSans-Regular.woff -------------------------------------------------------------------------------- /content/topics/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | template = "topics.html" 3 | page_template = "topic-page.html" 4 | title = "Topics" 5 | +++ 6 | 7 | -------------------------------------------------------------------------------- /templates/shortcodes/packages.html: -------------------------------------------------------------------------------- 1 | {% import "macros/packages.html" as packages %} 2 | 3 | {{ packages::packages(packages=page.extra[packages]) }} -------------------------------------------------------------------------------- /content/news/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | template = "news.html" 3 | page_template = "news-page.html" 4 | title = "Latest News" 5 | sort_by = "date" 6 | +++ 7 | 8 | -------------------------------------------------------------------------------- /templates/macros/news_item.html: -------------------------------------------------------------------------------- 1 | {% macro news_item(post) %} 2 |
  • 3 | {{post.date | date }}{{ post.title }} 4 |
  • 5 | {% endmacro input %} -------------------------------------------------------------------------------- /templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | 5 |
    6 | 7 |

    {{page.title}}

    8 | 9 | {{page.content | markdown | safe}} 10 | 11 |
    12 | 13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /templates/macros/packages.html: -------------------------------------------------------------------------------- 1 | {% import "macros/package.html" as package %} 2 | {% macro packages(packages) %} 3 | 8 | {% endmacro packages %} -------------------------------------------------------------------------------- /content/topics/nodejs.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Node.js" 3 | 4 | [extra] 5 | 6 | level = 0 7 | 8 | intro = "Rust can be used to write fast and safe native Node.js modules through bindings to the V8 engine!" 9 | 10 | packages = [ 11 | "napi", 12 | "neon", 13 | "node-bindgen" 14 | ] 15 | 16 | newstag = "node.js" 17 | +++ 18 | -------------------------------------------------------------------------------- /content/topics/binary-protocols.md: -------------------------------------------------------------------------------- 1 | +++ 2 | 3 | title = "Binary protocols" 4 | 5 | [extra] 6 | 7 | level = 1 8 | 9 | intro = "Binary protocol support" 10 | 11 | packages = [ 12 | "avro-rs", 13 | "capnp", 14 | "protobuf", 15 | "prost", 16 | "tarpc", 17 | "tonic", 18 | "flatbuffers", 19 | "thrift" 20 | ] 21 | 22 | 23 | news_tag = "binary-protocols" 24 | +++ 25 | -------------------------------------------------------------------------------- /sass/styles/_breakpoints.scss: -------------------------------------------------------------------------------- 1 | @mixin for-phone-only { 2 | @media (max-width: 599px) { @content; } 3 | } 4 | @mixin for-tablet-portrait-up { 5 | @media (min-width: 600px) { @content; } 6 | } 7 | @mixin for-tablet-landscape-up { 8 | @media (min-width: 900px) { @content; } 9 | } 10 | @mixin for-desktop-up { 11 | @media (min-width: 1200px) { @content; } 12 | } 13 | @mixin for-big-desktop-up { 14 | @media (min-width: 1800px) { @content; } 15 | } -------------------------------------------------------------------------------- /content/topics/wasm-runtimes.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "WebAssembly Runtimes" 3 | 4 | [extra] 5 | 6 | level = 2 7 | 8 | intro = "While the main showcase of WebAssembly initially was the web browser, there is new exciting work on using it outside too. Here is a list of WebAssembly runtimes that are compatible with Rust." 9 | 10 | packages = [ 11 | "wasmer", 12 | "wasmtime", 13 | "watt" 14 | ] 15 | 16 | newstag = "webassembly-runtimes" 17 | +++ 18 | -------------------------------------------------------------------------------- /sass/styles/topic.scss: -------------------------------------------------------------------------------- 1 | .upcoming { 2 | margin: 0.5rem 0; 3 | padding: 0; 4 | list-style: none; 5 | } 6 | 7 | .upcoming li { 8 | display: inline; 9 | margin: 0; 10 | padding: 0; 11 | } 12 | 13 | .upcoming li p { 14 | display: inline; 15 | } 16 | 17 | .upcoming li:not(:last-of-type):after { 18 | display: inline; 19 | content: " ,"; 20 | } 21 | 22 | .upcoming li:last-of-type:after { 23 | display: inline; 24 | content: "."; 25 | } 26 | -------------------------------------------------------------------------------- /content/topics/logging.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Logging" 3 | 4 | [extra] 5 | 6 | intro = "Logging is part of the rust ecosystem for a long time and with log and env_logger you have some great defaults." 7 | 8 | level = 1 9 | 10 | packages = [ 11 | "log", 12 | "console_log", 13 | "env_logger", 14 | "pretty_env_logger", 15 | "fern", 16 | "log4rs", 17 | "syslog", 18 | "flexi_logger", 19 | "sentry", 20 | "tracing" 21 | ] 22 | 23 | newstag = "logging" 24 | +++ 25 | -------------------------------------------------------------------------------- /content/topics/asyncio.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Async I/O" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "List of different packages, related to asynchronous I/O and `async/await`" 9 | 10 | packages = [ 11 | "async-compression", 12 | "async-std", 13 | "async-stream", 14 | "async-trait", 15 | "futures", 16 | "futures-intrusive", 17 | "futures-timer", 18 | "smol", 19 | "stream-cancel", 20 | "tokio", 21 | "tracing" 22 | ] 23 | 24 | news_tag = "asyncio" 25 | +++ 26 | -------------------------------------------------------------------------------- /content/topics/http-clients.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "HTTP Clients" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "Without a proper HTTP Client there isn't much web - even for the backend, scraping or API-Services on the web HTTP is the protocol of choice. Thus a stable, strong HTTP-Client stack is very important to any web-ecosystem." 9 | 10 | packages = [ 11 | "curl", 12 | "hyper", 13 | "isahc", 14 | "reqwest", 15 | "surf", 16 | "ureq", 17 | ] 18 | 19 | news_tag = "clients" 20 | +++ 21 | -------------------------------------------------------------------------------- /content/topics/compression.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Compression Libs" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "One of the first things almost anyone does to improve performance (specifically bandwidth) is to turn on compression. Luckily compression is well supported in rust." 9 | 10 | packages = [ 11 | "async-compression", 12 | "flate2", 13 | "tar", 14 | "inflate", 15 | "bzip2", 16 | "brotli", 17 | "snap", 18 | "zip", 19 | "zstd" 20 | ] 21 | 22 | newstag = "compression" 23 | +++ 24 | -------------------------------------------------------------------------------- /content/topics/syndication.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Syndication/RSS" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "Syndication has often been announced dead just to still stick around. Parsing and generating good RSS feeds isn't especially hard, but also something you don't necessarily want to have to do yourself. There are some libraries and packages to help you with that." 9 | 10 | packages = [ 11 | "atom_syndication", 12 | "rss", 13 | "feed-rs" 14 | ] 15 | 16 | newstag = "syndication" 17 | +++ 18 | -------------------------------------------------------------------------------- /content/topics/utils.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Web Utils" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "This collects a range of packages which are commonly used and needed in web development, like URL or HTTP-Body-parsers." 9 | 10 | packages = [ 11 | "cookie", 12 | "clap", 13 | "http", 14 | "tempfile", 15 | "regex", 16 | "chrono", 17 | "time", 18 | "backtrace", 19 | "scraper", 20 | "serde_urlencoded", 21 | "serde_qs", 22 | "structopt", 23 | "url" 24 | ] 25 | 26 | newstag = "utils" 27 | +++ 28 | -------------------------------------------------------------------------------- /content/topics/testing.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Testing" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "Rust and Cargo have a very good system for testing. However, there are still many useful utility crates that make testing easier. Some of them are listed below:" 9 | 10 | packages = [ 11 | "actix-http-test", 12 | "httpmock", 13 | "insta", 14 | "mockito", 15 | "mockall", 16 | "proptest", 17 | "quickcheck", 18 | "rstest", 19 | "tokio-test", 20 | "wiremock" 21 | ] 22 | 23 | news_tag = "testing" 24 | +++ 25 | -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | # The URL the site will be built for 2 | base_url = "https://www.arewewebyet.org/" 3 | 4 | # Whether to automatically compile all Sass files in the sass directory 5 | compile_sass = true 6 | 7 | # Whether to build a search index to be used later on by a JavaScript library 8 | build_search_index = false 9 | 10 | [markdown] 11 | # Whether to do syntax highlighting 12 | # Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola 13 | highlight_code = false 14 | 15 | [extra] 16 | # Put all your custom variables here 17 | -------------------------------------------------------------------------------- /content/topics/email.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Email" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "What would the web be without Email? It is one of the mose widely used communication, authentication, and notification systems. There are rust crates providing smtp and imap clients, as well integrations with third party email delivery services." 9 | 10 | packages = [ 11 | "async-imap", 12 | "email", 13 | "imap", 14 | "imap-proto", 15 | "lettre", 16 | "mail-auth", 17 | "mail-parser", 18 | "mail-send", 19 | "mrml", 20 | "sendgrid", 21 | ] 22 | 23 | newstag = "email" 24 | +++ 25 | -------------------------------------------------------------------------------- /sass/styles/fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Fira Sans'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: local('Fira Sans Light'), url("fonts/FiraSans-Light.woff") format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Fira Sans'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Fira Sans'), url("fonts/FiraSans-Regular.woff") format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Fira Sans'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: local('Fira Sans Medium'), url("fonts/FiraSans-Medium.woff") format('woff'); 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /templates/topics.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/level.html" as level %} 3 | 4 | {% block content %} 5 |
    6 | 7 |

    {{ section.title }}

    8 | 9 |
    10 | {% for page in section.pages %} 11 | 12 |

    13 | {{ page.title | safe }} 14 | {{ level::level(level=page.extra.level) }} 15 |

    16 | 17 | {% if page.extra.intro %} 18 | {{ page.extra.intro | markdown | safe }} 19 | {% endif %} 20 | 21 | {% endfor %} 22 | 23 |
    24 | 25 |
    26 | {% endblock %} -------------------------------------------------------------------------------- /sass/styles/level-indicator.scss: -------------------------------------------------------------------------------- 1 | .level-indicator { 2 | font-weight: 300; 3 | font-size: 0.65em; 4 | vertical-align: middle; 5 | color: white; 6 | } 7 | 8 | .level-indicator .fa { 9 | color: #E4371B; 10 | } 11 | 12 | .level-indicator.level-0 .fa { 13 | color: #04EC04; 14 | } 15 | 16 | .level-indicator.level-1 .fa { 17 | color: #08C008; 18 | } 19 | 20 | .level-indicator.level-2 .fa { 21 | color: #00ab00; 22 | } 23 | 24 | .level-indicator.level-3 .fa { 25 | color: #026302; 26 | } 27 | 28 | .level-indicator.level-4 .fa { 29 | color: #E4B71B; 30 | } 31 | 32 | .level-indicator.level-5 .fa { 33 | color: #E4771B; 34 | } 35 | -------------------------------------------------------------------------------- /content/topics/encoding.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "En- & Decoding" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "Encoding is one of those things you don't really want to bother about, but just rely on a well tested library for – there are just too many edge and quirky cases. Luckily, as a system language, this is one of the things rust shines at – and offers a set of nice packages for all data formats." 9 | 10 | packages = [ 11 | "base64", 12 | "data-encoding", 13 | "encoding_rs", 14 | "gif", 15 | "jpeg-decoder", 16 | "png", 17 | "serde_qs", 18 | "serde_urlencoded", 19 | "tiff" 20 | ] 21 | 22 | newstag = "encoding" 23 | +++ 24 | -------------------------------------------------------------------------------- /content/topics/serializer.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Serializers" 3 | 4 | [extra] 5 | 6 | intro = "Serializers allow you to easily transfer states and reliably get it back – important not only when working with JSON but also backbone of many types of worker-queue systems. Many of these crates are built on top of [Serde](https://www.arewewebyet.org/topics/serializer/#pkg-serde), the awesome serialization framework for Rust." 7 | 8 | level = 0 9 | 10 | packages = [ 11 | "async-bincode", 12 | "bincode", 13 | "rmp", 14 | "serde", 15 | "serde_json", 16 | "serde_yaml", 17 | "serde_bytes", 18 | "toml", 19 | "quick-xml" 20 | ] 21 | 22 | newstag = "serialiser" 23 | +++ 24 | -------------------------------------------------------------------------------- /content/topics/templating.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Templating" 3 | 4 | [extra] 5 | 6 | level = 0 7 | 8 | intro = "No Web-App is complete if it doesn't spit out HTML at least some of the time. Managing that, and making sure it renders performant and can be maintained is what templating libraries focus on. Rust has many traditional templating languages, as well as macro-based libraries that enforce type safety! Some of these are listed below." 9 | 10 | packages = [ 11 | "ammonia", 12 | "askama", 13 | "tera", 14 | "handlebars", 15 | "liquid", 16 | "maud", 17 | "markup", 18 | "pulldown-cmark", 19 | "comrak", 20 | "minijinja" 21 | ] 22 | 23 | newstag = "templating" 24 | +++ 25 | -------------------------------------------------------------------------------- /content/topics/browser.md: -------------------------------------------------------------------------------- 1 | +++ 2 | 3 | title = "Browser" 4 | 5 | [extra] 6 | 7 | level = 4 8 | 9 | intro = "The Webbrowser is the bastion, the holy grail of web development and one of the biggest projects in the Rust ecosystem focusses exactly on that. If Rust achieves to run a browser engine, be used to write server code while also being used as the frontend-development language _within the browser_, then it will truly be the language of the web like no other." 10 | 11 | packages = [ 12 | "fantoccini", 13 | "headless_chrome", 14 | "thirtyfour" 15 | ] 16 | 17 | news_tag = "browser" 18 | +++ 19 | 20 |

    Web Rendering Engine: Servo

    21 | 22 | Not yet published on crates.io but steady and continuously developed by Mozilla. 23 | 24 | -------------------------------------------------------------------------------- /sass/styles/home.scss: -------------------------------------------------------------------------------- 1 | @import "_breakpoints"; 2 | @import "_font-mixins"; 3 | 4 | .legend { 5 | @include interpolate(font-size, 320px, 1366px, 14px, 20px); 6 | list-style: none; 7 | margin: 1rem 0; 8 | padding: 0; 9 | } 10 | 11 | .legend li { 12 | display: inline; 13 | margin-right: 0.75em; 14 | } 15 | 16 | .topic-list { 17 | list-style: none; 18 | padding: 0; 19 | display: inline; 20 | } 21 | 22 | .topic-list li { 23 | display: inline-block; 24 | padding: 5px; 25 | } 26 | 27 | .tagline { 28 | margin: 0 0 0.5em; 29 | color: #000; 30 | font-size: 3rem; 31 | @include for-tablet-portrait-up { 32 | font-size: 3.5rem; 33 | } 34 | @include for-tablet-landscape-up { 35 | font-size: 5rem; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /content/topics/web-apis.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "External Web APIs" 3 | 4 | [extra] 5 | 6 | intro = "With many Web-Apps we want to reach farther than our locally hosted services and reach APIs hosted by other platforms and services outside our network. Connecting to the outside world is important, too many modern web applications are useless without an external party they connect to and interact with. There are many client libraries for most of the popular web APIs. Some of them are listed below:" 7 | 8 | level = 2 9 | 10 | packages = [ 11 | "rspotify", 12 | "serenity", 13 | "google_maps", 14 | "google-drive", 15 | "teloxide", 16 | "async-nats", 17 | ] 18 | 19 | missing = [ 20 | "Facebook" 21 | ] 22 | 23 | newstag = "apis" 24 | +++ 25 | 26 | -------------------------------------------------------------------------------- /content/topics/i18n.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Internationalization" 3 | 4 | [extra] 5 | 6 | level = 4 7 | 8 | intro = "Internationalization is still a work in progress. There is no standard mature implementation of i18n in Rust, although there are many newer libraries aiming to fill this gap." 9 | 10 | 11 | packages = [ 12 | "fluent", 13 | "gettext-rs", 14 | "intl_pluralrules", 15 | "num-format", 16 | "rust_icu" 17 | ] 18 | 19 | missing = [ 20 | "a proper [ECMA 402 Intl Implementation](https://github.com/rust-lang/rfcs/issues/858)" 21 | ] 22 | 23 | upcoming = [ 24 | { name = "ICU4X", url = "https://github.com/unicode-org/icu4x", desc = "Solving i18n for client-side and resource-constrained environments" } 25 | ] 26 | 27 | newstag = "i18n" 28 | +++ 29 | -------------------------------------------------------------------------------- /content/topics/auth.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Authorization/Authentication" 3 | 4 | [extra] 5 | 6 | intro = "Authorization and Authentication are a big deal for web development. Take OAuth, the most widely used protocol of authentication between services on the web. Such a simple idea, but with so many varying implementations (twitter, facebook, whatever...) and tricky parts in the details – it's almost impossible to get right without a library. Luckily, these crates will help you address authentication problems. For hashing and algorithm crates, see: [Cryptography](https://www.arewewebyet.org/topics/crypto/)" 7 | 8 | level = 1 9 | 10 | packages = [ 11 | "casbin", 12 | "cookie", 13 | "jsonwebtoken", 14 | "oauth2", 15 | "openssl", 16 | "oxide-auth", 17 | "yup-oauth2" 18 | ] 19 | 20 | news_tag = "auth" 21 | +++ 22 | -------------------------------------------------------------------------------- /templates/news.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% import "macros/news_item.html" as news %} 4 | 5 | {% block content %} 6 |
    7 | 8 |

    {{ section.title }}

    9 | 10 | 15 | 16 | 17 |
    18 |

    Are we missing some important news?

    19 |

    Did we miss an important announcement or update? Or maybe you want to share some good news about future development 20 | with our audience? Please go ahead! 23 |

    24 |
    25 | 26 |
    27 | {% endblock %} -------------------------------------------------------------------------------- /templates/curators.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/author.html" as author %} 3 | 4 | {% block content %} 5 |
    6 | 7 |

    {{page.title}}

    8 | 9 |

    Are We Web Yet (AWWY) is curated by:

    10 | 11 | {% set authors = load_data(path="authors.toml") %} 12 | {% for key, value in authors %} 13 | {% if value.curator %} 14 | {{ author::author(key=key,author=authors[key]) }} 15 | {% endif %} 16 | {% endfor %} 17 | 18 | 19 |
    20 |

    You want to become a curator?

    21 |

    You want to help us curate this website? Well, that is just awesome. Please follow this guide to join! 24 |

    25 |
    26 |
    27 | {% endblock %} -------------------------------------------------------------------------------- /content/topics/lower-web-stack.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Lower Web-Stack" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "A strong lower web-stack is important not only to build strong web frameworks on top, but also to allow performance critical systems to reach deeper to squeeze out extra juice. Rust has a good support on HTTP servers, even an HTTP2 implementation, websockets and other protocols." 9 | 10 | http = [ 11 | "async-h1", 12 | "h2", 13 | "hyper", 14 | "tiny-http" 15 | ] 16 | 17 | websocket = [ 18 | "tungstenite", 19 | "async-tungstenite", 20 | "tokio-tungstenite" 21 | ] 22 | 23 | protocols = [ 24 | "quinn", 25 | "sozu" 26 | ] 27 | 28 | newstag = "stack" 29 | 30 | +++ 31 | ## HTTP Stack 32 | 33 | {{ packages(packages='http') }} 34 | 35 | ## Websocket 36 | 37 | {{ packages(packages='websocket') }} 38 | 39 | ## Other protocols 40 | 41 | {{ packages(packages='protocols') }} 42 | -------------------------------------------------------------------------------- /content/topics/webassembly.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "WebAssembly" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "Rust can even run on the browser, by compiling to WebAssembly. This means that you can take advantage of the amazing Rust ecosystem on the browser! Rust and WebAssembly integrate with existing Javascript tooling. It supports NPM, Webpack, and ECMAScript modules! Here are some of the awesome Rust and WebAssembly projects out there. For frontend WebAssembly frameworks, see: [WebAssembly Frameworks](https://www.arewewebyet.org/topics/frameworks#frontend)" 9 | 10 | packages= [ 11 | "cargo-wasi", 12 | "console_error_panic_hook", 13 | "console_log", 14 | "dominator", 15 | "futures-signals", 16 | "gloo", 17 | "parity-wasm", 18 | "plotters", 19 | "stdweb", 20 | "wasm-bindgen", 21 | "walrus", 22 | "wasmi", 23 | "wasm-pack", 24 | "trunk" 25 | ] 26 | 27 | newstag = "webassembly" 28 | +++ 29 | -------------------------------------------------------------------------------- /sass/styles/news.scss: -------------------------------------------------------------------------------- 1 | .meta { 2 | font-size: 0.6em; 3 | line-height: 0.5em; 4 | padding: 0; 5 | margin: 10px 0 0 0; 6 | } 7 | 8 | .news-item .date { 9 | font-size: 0.8em; 10 | margin-right: 0.51em; 11 | } 12 | 13 | .news h1 { 14 | font-size: 2em; 15 | } 16 | 17 | .news h1::before { 18 | content: " News » "; 19 | display: inline-block; 20 | font-size: 0.35em; 21 | color: white; 22 | background: #666; 23 | padding: 0.25em 0.75em; 24 | margin-right: 1em; 25 | vertical-align: middle; 26 | } 27 | 28 | .news .meta ul { 29 | list-style: none; 30 | margin: 0; 31 | padding: 0; 32 | display: inline; 33 | } 34 | 35 | .news .meta ul li { 36 | display: inline-block; 37 | font-style: italic; 38 | } 39 | 40 | blockquote { 41 | border-left: #eee 0.34em solid; 42 | padding-left: 1em; 43 | font-weight: 300; 44 | margin-left: 2em; 45 | } 46 | 47 | cite { 48 | font-size: 0.75em; 49 | } 50 | -------------------------------------------------------------------------------- /.github/workflows/zola.yml: -------------------------------------------------------------------------------- 1 | name: github pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - gh-pages 7 | pull_request: 8 | 9 | jobs: 10 | build_and_deploy: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | 15 | - name: Install Zola 16 | run: | 17 | wget "https://github.com/getzola/zola/releases/download/v0.19.1/zola-v0.19.1-x86_64-unknown-linux-gnu.tar.gz" 18 | sudo tar xzf ./zola-v0.19.1-x86_64-unknown-linux-gnu.tar.gz 19 | 20 | - name: Build 21 | run: "export CURRENT_TIME=$(date '+%d %B %Y'); ./zola build" 22 | 23 | - name: Deploy 24 | uses: peaceiris/actions-gh-pages@v4 25 | if: ${{ github.ref == 'refs/heads/gh-pages' }} 26 | with: 27 | github_token: ${{ secrets.GITHUB_TOKEN }} 28 | publish_dir: ./public 29 | publish_branch: zola-build 30 | cname: www.arewewebyet.org 31 | -------------------------------------------------------------------------------- /content/news/2015-05-11-kafka-client-for-rust.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Kafka Client for Rust" 3 | date = 2015-05-11 4 | 5 | [extra] 6 | 7 | source = { author = "Spicavigo", link = { url = "https://users.rust-lang.org/t/kafka-client-for-rust/1324", name = "Rust Users Forum" } } 8 | 9 | tags = [ 10 | "services", 11 | "kafka" 12 | ] 13 | +++ 14 | 15 |

    Hello,

    16 | 17 |

    I have create Kafka client for Rust. The client supports Metadata, Produce, Fetch, and Offset requests. I plan to add support of Consumers soon.

    18 | 19 |

    I am using 1.0.0-beta

    20 | 21 |

    code: https://github.com/spicavigo/kafka-rust
    doc: http://fauzism.co/rustdoc/kafka/index.html
    crate: kafka

    22 | 23 |

    I started learning Rust a week ago so any feedback will be useful.

    24 | 25 |

    --
    Yousuf

    26 | -------------------------------------------------------------------------------- /sass/styles/core.scss: -------------------------------------------------------------------------------- 1 | @import "_font-mixins"; 2 | 3 | $min_width: 320px; 4 | $max_width: 1200px; 5 | $min_font: 16px; 6 | $max_font: 24px; 7 | 8 | * { 9 | box-sizing: border-box; 10 | } 11 | 12 | body, html { 13 | overflow-x: hidden; 14 | margin: 0; 15 | padding: 0; 16 | @include interpolate(font-size, 320px, 1366px, 16px, 24px); 17 | } 18 | 19 | header { 20 | line-height: 2; 21 | } 22 | 23 | h1, h2, h3, h4, h5, h6, strong { 24 | font-weight: 400; 25 | } 26 | 27 | h1 { 28 | margin: 0; 29 | color: #666; 30 | font-weight: 300; 31 | @include interpolate(font-size, 320px, 1366px, 46px, 72px); 32 | } 33 | 34 | html { 35 | font-family: Fira Sans, Helvetica Neue, Helvetica, Arial, sans-serif; 36 | background-color: white; 37 | background-repeat: no-repeat; 38 | color: #202020; 39 | line-height: 1.6; 40 | font-weight: 300; 41 | width: 100%; 42 | } 43 | 44 | @media print { 45 | :root { 46 | color: #000; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /sass/styles/_font-mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin interpolate($properties, $min-screen, $max-screen, $min-value, $max-value) { 2 | & { 3 | @each $property in $properties { 4 | #{$property}: $min-value; 5 | } 6 | 7 | @media screen and (min-width: $min-screen) { 8 | @each $property in $properties { 9 | #{$property}: calc-interpolation($min-screen, $min-value, $max-screen, $max-value); 10 | } 11 | } 12 | 13 | @media screen and (min-width: $max-screen) { 14 | @each $property in $properties { 15 | #{$property}: $max-value; 16 | } 17 | } 18 | } 19 | } 20 | 21 | @function calc-interpolation($min-screen, $min-value, $max-screen, $max-value) { 22 | $a: ($max-value - $min-value) / ($max-screen - $min-screen); 23 | $b: $min-value - $a * $min-screen; 24 | 25 | $sign: "+"; 26 | @if ($b < 0) { 27 | $sign: "-"; 28 | $b: abs($b); 29 | } 30 | @return calc(#{$a*100}vw #{$sign} #{$b}); 31 | } 32 | 33 | -------------------------------------------------------------------------------- /content/news/2016-02-09-pwhash-a-password-hashing-verification-library.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Pwhash: a password hashing/verification library" 3 | date = 2016-02-09 4 | 5 | [extra] 6 | 7 | source = { author = "Ivan Nejgebauer (inejge)", link = { url = "https://users.rust-lang.org/t/pwhash-a-password-hashing-verification-library/4581", name = "Rust Users Forum" } } 8 | tags = [ 9 | "crypto", 10 | "passwords" 11 | ] 12 | +++ 13 | 14 |

    Pwhash is a crate which lets you easily generate a hash from a password using several common algorithms, or check a password against an existing hash. You can get it from crates.io, or browse the source repository.

    15 | 16 |

    The initial release contains algorithms commonly found on free Unices. It shouldn't be difficult to extend if there's interest.

    17 | 18 |

    Comments/suggestions/criticism are welcome.

    19 | -------------------------------------------------------------------------------- /sass/styles/base.scss: -------------------------------------------------------------------------------- 1 | @import "_breakpoints"; 2 | @import "_font-mixins"; 3 | 4 | .content { 5 | position: relative; 6 | padding: 1rem 2rem; 7 | min-height: 600px; 8 | 9 | @include for-tablet-portrait-up { 10 | padding: 2em 4em; 11 | margin: 0 auto; 12 | } 13 | } 14 | 15 | .content:before { 16 | position: absolute; 17 | top: 0; 18 | left: 0; 19 | right: 0; 20 | z-index: -1; 21 | height: 1050px; 22 | max-height: 100%; 23 | display: block; 24 | content: " "; 25 | background-image: linear-gradient(to bottom, rgba(250,250,250,0.6), transparent); 26 | } 27 | 28 | .rust-logo { 29 | position: absolute; 30 | top: -64px; 31 | right: -64px; 32 | width: 256px; 33 | height: 256px; 34 | opacity: 0.25; 35 | z-index: -2; 36 | -webkit-transform: rotate(35deg); 37 | transform: rotate(35deg); 38 | 39 | @include for-tablet-landscape-up { 40 | top: -128px; 41 | right: -128px; 42 | width: 512px; 43 | height: 512px; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /content/topics/frameworks.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Web Frameworks" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "When building a modern web-application you don't want to bother on how to parse the http-header or where the route is supposed to be dispatched to. Frameworks offer exactly those features and make it quick'n'easy to build your specific app on the web-stack. Rust has many backend server frameworks, as well as frontend frameworks for building client apps with webassembly." 9 | 10 | server = [ 11 | "actix-web", 12 | "gotham", 13 | "rocket", 14 | "tide", 15 | "warp", 16 | "axum", 17 | "poem", 18 | "salvo" 19 | ] 20 | 21 | frontend = [ 22 | "leptos", 23 | "dioxus", 24 | "iced", 25 | "sauron", 26 | "sycamore", 27 | "yew" 28 | ] 29 | 30 | newstag = "frameworks" 31 | +++ 32 | 33 |

    Server

    34 | 35 | {{ packages(packages='server') }} 36 | 37 |

    Frontend (WebAssembly)

    38 | 39 | {{ packages(packages='frontend') }} 40 | -------------------------------------------------------------------------------- /scripts/update_crates.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | BASE="data/pkgs" 4 | FILES=`ls -1 $BASE` 5 | SERVER="https://crates.io/api/v1/crates/" 6 | NEW_VERSIONS="" 7 | for f in "$@" 8 | do 9 | if [[ "$f" == *json ]]; 10 | then 11 | pkg=${f::${#f}-5} 12 | else 13 | pkg=$f 14 | fi 15 | 16 | PKG_INFO="$BASE/$pkg.json" 17 | VERSION="new" 18 | if [ -f $PKG_INFO ]; then 19 | VERSION=`cat $PKG_INFO | bash ./scripts/JSON.sh -b | grep '\["crate","max_version"\]' | awk -F' ' '{gsub(/"/, "", $2); print $2}'` 20 | fi 21 | echo "Updating $pkg ($VERSION)" 22 | curl --fail -H "Accept:application/json" -X GET $SERVER$pkg > "$PKG_INFO" 23 | 24 | NEW_VERSION=`cat $PKG_INFO | bash ./scripts/JSON.sh -b | grep '\["crate","max_version"\]' | awk -F' ' '{gsub(/"/, "", $2); print $2}'` 25 | 26 | if [ "$VERSION" != "$NEW_VERSION" ]; then 27 | NEW_VERSIONS+="\n - [$pkg](https://crates.io/crates/$pkg) ($VERSION => $NEW_VERSION)" 28 | fi 29 | done 30 | printf "## Crates updates found: \n $NEW_VERSIONS\n" 31 | -------------------------------------------------------------------------------- /templates/macros/level.html: -------------------------------------------------------------------------------- 1 | {% macro level(level) %} 2 | 3 | {% if level == 0 %} 4 | {% elif level == 1 %} 5 | {% elif level == 2 %} 6 | {% elif level == 3 %} 7 | {% elif level == 4 %} 8 | {% elif level == 5 %} 9 | {% else %} {% endif %} 10 | {% endmacro level %} -------------------------------------------------------------------------------- /sass/styles/authors.scss: -------------------------------------------------------------------------------- 1 | @import "_breakpoints"; 2 | 3 | .authors { 4 | font-size: 0.75em; 5 | margin-top: 5em; 6 | &:before { 7 | display: inline-block; 8 | width: 50%; 9 | border-top: 2px solid #eee; 10 | content: " "; 11 | margin-left: 25%; 12 | } 13 | h3 { 14 | margin: 0; 15 | padding: 0; 16 | } 17 | } 18 | 19 | .avatar { 20 | grid-area: avatar; 21 | height: 3em; 22 | margin-right: 1em; 23 | border-radius: 50%; 24 | border: 2px #eee solid; 25 | align-self: center; 26 | } 27 | 28 | .author { 29 | margin: 2em 0; 30 | display: grid; 31 | grid-template: 32 | "avatar name" auto 33 | "avatar social" auto 34 | "bio bio" auto 35 | / auto 1fr; 36 | } 37 | 38 | .social-media { 39 | grid-area: social; 40 | margin: 0; 41 | } 42 | 43 | .social-media a { 44 | margin-left: .7em; 45 | display: inline-block; 46 | } 47 | 48 | .social-media a:first-of-type { 49 | margin-left: 0; 50 | } 51 | 52 | .bio { 53 | grid-area: bio; 54 | margin: .5em 0 1em; 55 | } -------------------------------------------------------------------------------- /content/news/2015-05-08-rustful-0-1-0-is-now-available-on-crates-io.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Rustful 0.1.0 is now available on crates.io" 3 | date = 2015-05-08 4 | 5 | [extra] 6 | 7 | source = { author = "ogeon", link = { url = "https://users.rust-lang.org/t/rustful-0-1-0-is-now-available-on-crates-io/1298", name = "Rust Users Forum" } } 8 | +++ 9 | 10 |

    I'm proud to announce that I have finally brought Rustful, a small web framework, to a state where it deserves a proper version number and a place on crates.io tada. I have also written an introduction to what it's currently all about and a little about its past and what the future holds. Take a look at what it has so far, give it a try and tell me what you think. I would be happy to hear your feedback.

    -------------------------------------------------------------------------------- /content/news/2015-07-30-treasure_orm_progress_query_api_just_grammar_docs.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Treasure orm progress. Query api (just \"grammar\"), docs.." 3 | date = 2015-07-30 4 | 5 | [extra] 6 | 7 | source = { author = "phonkee", link = { url = "https://www.reddit.com/r/rust/comments/3f31ov/treasure_orm_progress_query_api_just_grammar_docs/", name = "Rust Users Forum" } } 8 | 9 | tags = [ 10 | "database", 11 | "orm" 12 | ] 13 | +++ 14 | 15 | Hi all, 16 | This is update how treasure orm development progresses. 17 | I have added small portion of querying api macros (well honestly just "select" for now with filtering api, other are not implemented but documented how they will be implemented). 18 | 19 | Be aware that it's just "grammar". This query api should not change much in the future. Now I will start to work on query builder, which will this api will use. 20 | You can find more info about querying here [github.com/phonkee/treasure#query](https://github.com/phonkee/treasure#query) Also I have updated more documentation with ideas and future plans. 21 | 22 | Have a good day! 23 | phonkee 24 | -------------------------------------------------------------------------------- /scripts/import_dc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | function json_grep { 5 | local FILENAME="$1" 6 | local MATCH="$2" 7 | local MATCHED=$(cat $FILENAME | bash ./scripts/JSON.sh -b | grep $MATCH) 8 | echo ${MATCHED:${#MATCH}:${#MATCHED}-${#MATCH}-1} 9 | } 10 | 11 | for f in "$@" 12 | do 13 | echo "Fetching $f" 14 | TFILE=`mktemp` 15 | curl --fail "$f.json" > $TFILE 16 | TITLE=$(json_grep $TFILE '\["title"\]') 17 | SLUG=$(json_grep $TFILE '\["slug"\]') 18 | CREATED_AT=$(json_grep $TFILE '\["created_at"\]') 19 | CREATED_BY=$(json_grep $TFILE '\["post_stream","posts",0,"username"\]') 20 | POST=$(json_grep $TFILE '\["post_stream","posts",0,"cooked"\]') 21 | AUTHOR_NAME=$(json_grep $TFILE '\["post_stream","posts",0,"name"\]') 22 | DATE=${CREATED_AT:0:10} 23 | TARGET="_posts/$DATE-$SLUG.html" 24 | 25 | cat > $TARGET <Drivers 51 | 52 | {{ packages(packages='drivers') }} 53 | 54 |

    ORMs

    55 | 56 | {{ packages(packages='orms') }} 57 | 58 |

    Connection pools

    59 | 60 | {{ packages(packages='pools') }} 61 | 62 |

    Tooling

    63 | 64 | {{ packages(packages='tools') }} 65 | -------------------------------------------------------------------------------- /content/news/2015-07-26-treasure_orm_initial_design_with_small_working.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Treasure ORM - initial design, with small working parts (mapper)" 3 | date = 2015-07-26 4 | 5 | [extra] 6 | 7 | source = { author = "phonkee", link = { url = "https://www.reddit.com/r/rust/comments/3embft/treasure_orm_initial_design_with_small_working/", name = "Rust Users Forum" } } 8 | 9 | tags = [ 10 | "database", 11 | "orm" 12 | ] 13 | +++ 14 | 15 | Hi, 16 | 17 | I've been watching rust and its community for about a year, studied a lot about rust, and I have to say that I love rust. Time has come to try to build something real so I decided to start working on ORM for rust (yes ORM). 18 | 19 | Since rust is statically compiled and there is no way to do "inspection" I went the way of syntax extensions (nightly), and started to generate code. I have just small part working, so please be kind. 20 | 21 | If you are interested have a look at [github.com/phonkee/treasure](https://github.com/phonkee/treasure) 22 | 23 | I would be really happy if you can comment it or want to help with building/designing Treasure ORM, so we can make a green badge on [arewewebyet.com](http://www.arewewebyet.org). 24 | 25 | Thank you. 26 | -------------------------------------------------------------------------------- /content/news/2015-12-03-kinglet-an-asynchronous-http-server.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Kinglet – an asynchronous HTTP server" 3 | date = 2015-12-03 4 | 5 | [extra] 6 | 7 | source = { author = "pyfisch", link = { url = "https://users.rust-lang.org/t/kinglet-an-asynchronous-http-server/3855", name = "Rust Users Forum" } } 8 | 9 | 10 | tags = [ 11 | "stack", 12 | "kinglet", 13 | "async" 14 | ] 15 | +++ 16 | 17 |

    Kinglet is the beginning of a HTTP server based on mio. It manages connnections using state machines from rotor by @tailhook. The most interesting part is the request state machine: with only a few lines of code it supports parsing requests with fixed size bodies, chunked bodies with optional trailers and even pipelining. Adding support for more states like 100-Expect-Continue will be easy. Some parts of the code still need cleanup and the structures of requests and responses will change.

    18 | -------------------------------------------------------------------------------- /sass/styles/pkg.scss: -------------------------------------------------------------------------------- 1 | @import "_breakpoints"; 2 | 3 | .pkg-list { 4 | list-style: none; 5 | padding: 0 0 0 0.5em; 6 | } 7 | 8 | .pkg-name { 9 | margin-top: 2em; 10 | margin-right: 0.35em; 11 | font-weight: 400; 12 | } 13 | 14 | .pkg-meta { 15 | margin: 0; 16 | } 17 | 18 | .pkg-desc { 19 | font-size: 0.9em; 20 | margin: 0.1em 0 2em 0; 21 | } 22 | 23 | .pkg-links { 24 | width: 100%; 25 | margin: .5rem 0; 26 | 27 | @include for-tablet-portrait-up { 28 | display: inline; 29 | width: auto; 30 | } 31 | } 32 | 33 | .pkg-link { 34 | display: inline-block; 35 | margin: 0 1rem; 36 | font-size: 1.5rem; 37 | opacity: 0.5; 38 | vertical-align: middle; 39 | 40 | @include for-tablet-portrait-up { 41 | display: inline; 42 | font-size: 0.75rem; 43 | margin: .5rem; 44 | } 45 | } 46 | 47 | .pkg-link:first-of-type { 48 | margin-left: 0; 49 | @include for-tablet-portrait-up { 50 | margin: .5rem; 51 | } 52 | } 53 | 54 | .pkg-link:hover { 55 | opacity: 0.8; 56 | } 57 | 58 | li.pkg { 59 | margin-top: 1.5em; 60 | } 61 | 62 | .action { 63 | opacity: 0; 64 | transition: 0.25s; 65 | } 66 | 67 | *:hover > .action { 68 | opacity: 1; 69 | transition: 1s; 70 | } 71 | -------------------------------------------------------------------------------- /templates/macros/author.html: -------------------------------------------------------------------------------- 1 | {% macro author(key, author) %} 2 |
    3 | {% if author.img %} 4 | 5 | {% elif author.github %} 6 | 7 | {% else %} 8 | 9 | {% endif %} 10 | {% if author.curator %} 11 | 12 | {% endif %} 13 | {{author.name}} 14 | {% if author.curator %} 15 | 16 | {% endif %} 17 | 30 | 31 | {% if author.bio %} 32 |

    33 | {{author.bio | markdown(inline=true) | safe }} 34 |

    35 | {% endif %} 36 | 37 |
    38 | {% endmacro author %} -------------------------------------------------------------------------------- /content/topics/services.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "External Services" 3 | 4 | [extra] 5 | 6 | intro = "The modern web development stack doesn't only need a web-server but is often built on a range of external services to provide specific features, from worker queues to search and pubsub. There are many mature crates for popular external services. For services accessed through a Web API, such as Cloud SDKs, see: [External Web APIs](https://www.arewewebyet.org/topics/web-apis/) and for database support, see: [Databases](https://www.arewewebyet.org/topics/database/)" 7 | 8 | level = 1 9 | 10 | queues = [ 11 | "lapin", 12 | "tokio-amqp", 13 | "celery", 14 | "rdkafka", 15 | "nats", 16 | "tmq" 17 | ] 18 | 19 | data = [ 20 | "arrow", 21 | "arrow-flight", 22 | "datafusion", 23 | "parquet" 24 | ] 25 | 26 | search = [ 27 | "elasticsearch", 28 | "meilisearch-sdk", 29 | "tantivy" 30 | ] 31 | 32 | pubsub = [ 33 | "pulsar", 34 | "redis" 35 | ] 36 | 37 | newstag = "services" 38 | +++ 39 |

    Worker Queue

    40 | 41 | {{ packages(packages='queues') }} 42 | 43 |

    Data Processing

    44 | 45 | {{ packages(packages='data') }} 46 | 47 |

    Search Services

    48 | 49 | {{ packages(packages='search') }} 50 | 51 |

    Pubsub

    52 | 53 | {{ packages(packages='pubsub') }} 54 | -------------------------------------------------------------------------------- /content/news/2016-02-01-handlebars_templating_libraries_now_works_with.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Handlebars templating libraries now works with Serde data" 3 | date = 2016-02-01 4 | 5 | [extra] 6 | 7 | source = { author = "sunng", link = { url = "https://www.reddit.com/r/rust/comments/43j6ei/handlebars_templating_libraries_now_works_with/", name = "Rust Users Forum" } } 8 | 9 | tags = [ 10 | "templates", 11 | "serde", 12 | "handlebars", 13 | "serializer", 14 | "json" 15 | ] 16 | +++ 17 | 18 | Just a quick update on my handlebars libraries: You can now use serde for template data. 19 | 20 | This is implemented via a feature called `serde_type`. Internally we use `serde_json::value::Value` as data type which is pretty similar to the `Json` enum in rustc_serialize. Anything implements `serde::ser::Serialize` can be rendered. To use serde for handlebars-iron, configure your Cargo.toml like this: 21 | 22 | ``` 23 | [features] 24 | default = ["handlebars-iron/serde_type"] 25 | ``` 26 | 27 | The API is fully compatible with default one so you don't have to change any code except the data type. 28 | 29 | handlebars core: [github.com/sunng87/handlebars-rust](https://github.com/sunng87/handlebars-rust) 30 | handlebar iron middleware: [github.com/sunng87/handlebars-iron](https://github.com/sunng87/handlebars-iron) 31 | -------------------------------------------------------------------------------- /content/news/2016-01-11-dbmigrate-a-sql-migration-tool.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Dbmigrate, a SQL migration tool" 3 | date = 2016-01-11 4 | 5 | [extra] 6 | 7 | source = { author = "Keats", link = { url = "https://users.rust-lang.org/t/dbmigrate-a-sql-migration-tool/4242", name = "Rust Users Forum" } } 8 | 9 | tags = [ 10 | "database", 11 | "tooling", 12 | "dbmigrate" 13 | ] 14 | 15 | +++ 16 | 17 |

    dbmigrate

    18 | 19 |

    https://github.com/Keats/dbmigrate

    20 | 21 |

    I mentioned it before on reddit but since I just released a new version working with MySQL as well, might be worth putting it here.

    22 | 23 |

    This is a tool heavily inspired by a Go tool I've used: migrate and django migrations.

    24 | 25 |

    In short, a migration involves 2 sql files, a up and a down which are plain SQL and are executed depending on what you want do (running dbmigrate up will run all the up migrations not done yet in order for example).

    26 | 27 |

    This currently supports PostgreSQL and MySQL, adding a driver is not too hard so let me know if there's another database that could use it.

    28 | 29 |

    Also looking for feedback on needed commands I don't have implemented yet and general code review.

    30 | -------------------------------------------------------------------------------- /content/news/2015-06-23-herd-a-http-load-testing-application-written-in-rust.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Herd - A HTTP load testing application written in Rust" 3 | date = 2015-06-23 4 | 5 | [extra] 6 | 7 | source = { author = "Jacob Clark (imjacobclark)", link = { url = "https://users.rust-lang.org/t/herd-a-http-load-testing-application-written-in-rust/1912", name = "Rust Users Forum" } } 8 | +++ 9 | 10 |

    Hi Rust community,

    11 | 12 |

    I have begun developing a unix HTTP load testing application written in Rust! It's main focus is being easy to use and low on OS level dependencies such as the JVM (because it's written in Rust!).

    13 | 14 |

    Currently Herd is able to spawn thousands of concurrent requests to HTTP endpoints by making use of unix process forking and multithreadding, however, there are features I want to implement, but I'm looking for contributors to help get the project off the ground!

    15 | 16 |

    Contributions very welcome in the form of pull requests in github: https://github.com/imjacobclark/Herd

    17 | 18 |

    Todo

    19 | 20 | 29 | -------------------------------------------------------------------------------- /content/topics/cms.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "CMS" 3 | 4 | [extra] 5 | 6 | level = 4 7 | 8 | intro = "Managing digital content is a fundamental part of the web as we have it today. Content management systems aim to make it easier to create, update, and serve digital content. Currently, the Rust CMS ecosytem consists only of static site generators, which serve as frameworks for creating websites from static content files." 9 | 10 | static-site-generators = [ 11 | "cobalt-bin", 12 | "mdbook" 13 | ] 14 | 15 | news_tag = "cms" 16 | +++ 17 | 18 |

    Static Site Generators {{ level(level=1) }}

    19 | 20 | 34 | 35 | {{ packages(packages='static-site-generators') }} 36 | -------------------------------------------------------------------------------- /templates/news-page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/author.html" as author %} 3 | {% block content %} 4 | 5 |
    6 |
    7 |

    {{page.title}}

    8 | 9 |
    10 | Published {{page.date | date}} {% if page.extra.tags %} 11 | under
      12 | {% for tag in page.extra.tags %} 13 |
    • 14 | {{tag}} 15 |
    • 16 | {% endfor %} 17 |
    18 | {% endif %} 19 |
    20 | 21 | 22 | {% if page.extra.source %} 23 |
    24 | 25 | 26 | Posted 27 | {% if page.extra.source.link %} 28 | on {{page.extra.source.link.name}} 29 | {% endif %} 30 | 31 | {% if page.extra.source.author %} 32 | by {{page.extra.source.author}} 33 | {% endif %} : 34 | 35 | {{ page.content | safe }} 36 |
    37 | {% else %} 38 | {{ page.content | safe }} 39 | {% endif %} 40 |
    41 | 42 | {% set authors = load_data(path="authors.toml") %} 43 | {% for key, value in authors %} 44 | {% if key == page.extra.source.author %} 45 |
    46 |

    Author

    47 | {{ author::author(key=key,author=authors[key]) }} 48 |
    49 | {% endif %} 50 | {% endfor %} 51 |
    52 | {% endblock content %} -------------------------------------------------------------------------------- /scripts/import_reddit.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | function _base_json_grep { 5 | local FILENAME="$1" 6 | local MATCH="$2" 7 | echo $(cat $FILENAME | bash ./scripts/JSON.sh -b | grep $MATCH) 8 | } 9 | 10 | function json_grep { 11 | local FILENAME="$1" 12 | local MATCH="$2" 13 | local MATCHED=$(_base_json_grep $FILENAME $MATCH) 14 | echo ${MATCHED:${#MATCH}:${#MATCHED}-${#MATCH}-1} 15 | } 16 | 17 | function json_grep_int { 18 | local FILENAME="$1" 19 | local MATCH="$2" 20 | local MATCHED=$(_base_json_grep $FILENAME $MATCH) 21 | echo ${MATCHED:${#MATCH}-1:${#MATCHED}-${#MATCH}-1} 22 | } 23 | 24 | for f in "$@" 25 | do 26 | echo "Fetching $f" 27 | TFILE=`mktemp` 28 | curl --fail "$f.json" > $TFILE 29 | TITLE=$(json_grep $TFILE '\[0,"data","children",0,"data","title"\]') 30 | PERMALINK=$(json_grep $TFILE '\[0,"data","children",0,"data","permalink"\]') 31 | SLUG=$(echo "$PERMALINK" | awk -F"/" '{print $(NF-1)}') 32 | CREATED_AT=$(json_grep_int $TFILE '\[0,"data","children",0,"data","created"\]') 33 | echo $CREATED_AT 34 | CREATED_BY=$(json_grep $TFILE '\[0,"data","children",0,"data","author"\]') 35 | POST=$(json_grep $TFILE '\[0,"data","children",0,"data","selftext"\]') 36 | DATE=$(date -r "$CREATED_AT" +%Y-%m-%d) 37 | TARGET="_posts/$DATE-$SLUG.md" 38 | 39 | cat > $TARGET <(official release announcement here)

    17 | 18 |

    Hey folks,

    19 | 20 |

    Today I'm releasing version 0.1 of Diesel, a new ORM and Query Builder for Rust that I've been working on for the last few months. This isn't a port of Active Record or Hibernate, but is my take on what an ORM that "feels like Rust" looks like. I've been the maintainer of Active Record, which is the ORM for Ruby on Rails for some time, and I've taken a lot of the lessons from that experience and applied them here. Check out the getting started guide, and feel free to ping me here or open an issue if you have any problems or questions. It is by no means feature complete, and there's still gaps in the API to fill, but I've really been enjoying using the core of this thing, and I'm excited to share it with you.

    21 | -------------------------------------------------------------------------------- /content/topics/crypto.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Crypto" 3 | 4 | [extra] 5 | 6 | level = 1 7 | 8 | intro = "Cryptography is a corner stone of a trusted web. Without it many services could not be offered reliably. Rust has strong cryptography libraries. Many of these are managed by [Rust Crypto](https://github.com/RustCrypto), an organization that maintains cryptography algorithms written in pure Rust." 9 | 10 | suites = [ 11 | "openssl", 12 | "orion", 13 | "libsodium-sys", 14 | "gpgme", 15 | "ring" 16 | ] 17 | 18 | rng = [ 19 | "rand", 20 | "uuid" 21 | ] 22 | 23 | tls = [ 24 | "rustls", 25 | "tokio-openssl", 26 | "tokio-rustls", 27 | "openssl", 28 | "webpki", 29 | ] 30 | 31 | hashing = [ 32 | "bcrypt", 33 | "blake2", 34 | "djangohashers", 35 | "hmac", 36 | "fnv", 37 | "twox-hash", 38 | "md-5", 39 | "sha2", 40 | "pwhash" 41 | ] 42 | 43 | algorithms = [ 44 | "aes-gcm", 45 | "bulletproofs", 46 | "chacha20poly1305", 47 | "curve25519-dalek", 48 | "ed25519-dalek", 49 | "secp256k1", 50 | "subtle", 51 | "twox-hash", 52 | "x25519-dalek" 53 | ] 54 | 55 | newstag = "crypto" 56 | +++ 57 | 58 |
    59 | 60 |

    Suites {{ level(level=1) }}

    61 | 62 | {{ packages(packages='suites') }} 63 | 64 |

    Random Number Generators {{ level(level=0) }}

    65 | 66 | {{ packages(packages='rng') }} 67 | 68 |

    Hashing {{ level(level=1) }}

    69 | 70 | {{ packages(packages='hashing') }} 71 | 72 |

    Algorithms {{ level(level=1) }}

    73 | 74 | {{ packages(packages='algorithms') }} 75 | 76 |

    TLS {{ level(level=1) }}

    77 | 78 | {{ packages(packages='tls') }} 79 | -------------------------------------------------------------------------------- /content/news/2016-01-18-basic-http-server-a-simple-http-file-server-built-on-rotor.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Basic-http-server, a simple HTTP file server built on Rotor" 3 | date = 2016-01-18 4 | 5 | [extra] 6 | 7 | source = { author = "Brian Anderson (brson)", link = { url = "https://users.rust-lang.org/t/basic-http-server-a-simple-http-file-server-built-on-rotor/4332", name = "Rust Users Forum" } } 8 | 9 | tags = [ 10 | "stack", 11 | "static-sver" 12 | ] 13 | +++ 14 | 15 |

    While working on the docs I wanted to be able to serve them quickly, but didn't have a Rust-based tool for it, so I wrote basic-http-server as an excuse to play with rotor. It serves static files out of the current directory over HTTP.

    16 | 17 |

    Here is it's --help output.

    18 | 19 |

    USAGE:
    20 |    basic-http-server [FLAGS] [OPTIONS] [ARGS]
    21 | 
    22 |   FLAGS:
    23 |    -h, --help Prints help information
    24 |    -V, --version Prints version information
    25 | 
    26 |   OPTIONS:
    27 |    -a, --addr <ADDR> Sets the IP:PORT combination (default "127.0.0.1:4000")
    28 | 
    29 |   ARGS:
    30 |    ROOT Sets the root dir (default ".")
    31 | 32 |

    The source is simple and thoroughly commented.

    33 | 34 |

    I've had difficulty measuring how fast it is. When I measure with wrk the results seem good, but with ab all requests timeout. I suspect that's a bug in rotor-http, but don't know.

    35 | 36 |

    cc @tailhook

    37 | -------------------------------------------------------------------------------- /content/news/2015-06-25-hyper-v0-6.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "hyper v.0.6" 3 | date = 2015-06-25 4 | 5 | [extra] 6 | 7 | source = { author = "seanmonster", link = { url = "http://seanmonstar.com/post/122441373502/hyper-v06", name = "seanmonster.com" } } 8 | 9 | tags =[ 10 | "stack", 11 | "hyper" 12 | ] 13 | 14 | +++ 15 | 16 |

    A bunch of goodies are included in version 0.6 of hyper.

    17 | 18 |

    Highlights

    19 | 20 |
    • Experimental HTTP2 support for the Client! Thanks to tireless work of @mlalic.
    • 21 |
    • Redesigned Ssl support. The Server and Client can accept any implementation of the Ssl trait. By default, hyper comes with an implementation for OpenSSL, but this can now be disabled via the ssl cargo feature.
    • 22 |
    • A thread safe Client. As in, Client is Sync. You can share a Client over multiple threads, and make several requests simultaneously.
    • 23 |
    • Just about 90% test coverage. @winding-lines has been bumping the number ever higher.
    • 24 |

    Also, as a reminder, hyper has been following semver more closely, and so, breaking changes mean bumping the minor version (until 1.0). So, to reduce unplanned breakage, you should probably depend on a specific minor version, such as 0.6, and not *.

    25 |
    26 | -------------------------------------------------------------------------------- /templates/macros/package.html: -------------------------------------------------------------------------------- 1 | {% macro package(pkg_name) %} 2 | {% set pkg = load_data(url="https://crates.io/api/v1/crates/" ~ pkg_name ~ "?include=", format="json") %} 3 | {% if pkg %} 4 | {% set pkg = pkg.crate %} 5 |
  • 6 | {{pkg.name}} 8 | 9 | 30 | 31 | {% if pkg.id %} 32 |

    33 | 34 | 35 | 36 | {% if pkg.repository and pkg.repository is starting_with("https://github.com/") %} 37 | {% set repo = pkg.repository 38 | | trim_start_matches(pat="https://github.com/") 39 | | trim_end_matches(pat="/") 40 | | trim_end_matches(pat=".git") 41 | %} 42 | 43 | {% endif %} 44 |

    45 | {% endif %} 46 |

    47 | {{ pkg.description }} 48 |

    49 |
  • 50 | {% else %} 51 |

    PACKAGE MISSING: {{pkg_name}}

    52 | {% endif %} 53 | {% endmacro package %} 54 | -------------------------------------------------------------------------------- /authors.toml: -------------------------------------------------------------------------------- 1 | [giraffate] 2 | name = "Takayuki Nakata" 3 | curator = true 4 | github = "giraffate" 5 | 6 | [ibraheemdev] 7 | name = "Ibraheem Ahmed" 8 | curator = true 9 | github = "ibraheemdev" 10 | 11 | [ben] 12 | name = "Benjamin Kampmann" 13 | img = "http://gnunicorn.org/assets/images/ben.png" 14 | bio = "Freelance OpenSource Software Architect and Developer. I design, build and supervise the building of software (systems). Sometimes for clients, often times on my own, whenever possible as OpenSource. I care about good design in both, the User Experience and backend architecture and infrastructure. And I write about all this stuff." 15 | github = "gnunicorn" 16 | homepage = "http://gnunicorn.org/" 17 | 18 | [manishearth] 19 | name = "Manish Goregaokar" 20 | img = "https://www.gravatar.com/avatar/0a3069491bfded90cdf623341cadc1d1?s=512&d=identicon&r=PG" 21 | bio = "I’m a fourth year physics student studying at IIT Bombay. In my spare time I do a lot of programming, often open source, and participate in communities like Stack Exchange. These days I contribute to the [Servo browser engine](http://github.com/servo/servo) and occasionally to the [Rust programming language](http://github.com/rust-lang/rust)" 22 | twitter = "Manishearth" 23 | github = "manishearth" 24 | homepage = "http://manishearth.github.io/" 25 | 26 | [steve] 27 | name = "Steve Klabnik" 28 | img = "https://secure.gravatar.com/avatar/233c279c012ebac792aaa805f966cbc7?size=220" 29 | github = "steveklabnik" 30 | twitter = "steveklabnik" 31 | homepage = "http://words.steveklabnik.com/" 32 | bio = "Hi, I'm Steve! I enjoy turning coffee into code, writing, philosophy, and physical activity. This is my own little corner of the internets. Enjoy!" 33 | 34 | 35 | # The following aren't in the system but externals 36 | [flosse] 37 | name = "flosse" 38 | img = "https://avatars1.githubusercontent.com/u/276043?v=3&s=460" 39 | homepage = "https://github.com/flosse" 40 | 41 | [mattgreenrocks] 42 | name = "mattgreenrocks" 43 | img = "https://secure.gravatar.com/avatar/7e01d0a8ef8d90e1c5195f27b34ae999?r=pg&d=identicon&s=100" 44 | 45 | [seanmonster] 46 | name = "Sean McArthur" 47 | twitter = "seanmonster" 48 | img = "http://www.gravatar.com/avatar/dfb248d98bc7c238fccd5aad53624eab.png" 49 | -------------------------------------------------------------------------------- /templates/topic-page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/news_item.html" as news %} 3 | {% import "macros/level.html" as level %} 4 | {% import "macros/packages.html" as packages %} 5 | 6 | {% block content %} 7 |
    8 | 9 |

    {{page.title}} {{ level::level(level=page.extra.level) }}

    10 | 11 | {% if page.extra.intro %} 12 | {{ page.extra.intro | markdown | safe }} 13 | {% endif %} 14 | 15 | {{ page.content | safe }} 16 | 17 | {% if page.extra.packages %} 18 | {{ packages::packages(packages=page.extra.packages) }} 19 | {% endif %} 20 | 21 | {% if page.extra.upcoming %} 22 |

    Upcoming

    23 | The following crates look awesome! But they have not yet reached maturity. 24 |
      25 | {% for upcoming in page.extra.upcoming %} 26 |
    • {{upcoming.name}} {{upcoming.desc | markdown | safe }}
    • 27 | {% endfor %} 28 |
    29 | {% endif %} 30 | 31 | {% if page.extra.missing %} 32 |

    Still missing...

    33 |
      34 | {% for missed in page.extra.missing %} 35 |
    • {{missed | markdown | safe }}
    • 36 | {% endfor %} 37 |
    38 | {% endif %} 39 | 40 | {% if page.extra.news_tag %} 41 | 42 | {% set section = get_section(path="news/_index.md") %} 43 | {% set related_posts = [] %} 44 | 45 | {% for post in section.pages %} 46 | {% if post.extra.tags %} 47 | {% for tag in post.extra.tags %} 48 | {% if tag == page.extra.news_tag %} 49 | {% set_global related_posts = related_posts | concat(with=post) %} 50 | {% endif %} 51 | {% endfor %} 52 | {% endif %} 53 | {% endfor %} 54 | 55 | {% if related_posts.0 %} 56 |

    Related News

    57 | 62 | {% endif %} 63 | 64 | {% endif %} 65 | 66 |
    67 |

    Do you know something we don't?

    68 |

    Did we miss an important crate? Or maybe you just recently launched something that should be listed here, too? Let us know! 70 |

    71 |
    72 | 73 |
    74 | {% endblock content %} 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Are We Web Yet 2 | 3 | [This project](https://github.com/bashyHQ/arewewebyet) tries to give the answer to the question, "is the [Rust](http://rust-lang.org) ecosystem ready for web development yet?" This document gives an overview on the structure of the data, the technologies used and how you can contribute to the project. If you want to see the output of the project, please go to 4 | 5 | **[arewewebyet.org](http://www.arewewebyet.org/)** 6 | 7 | ## Contributing 8 | 9 | All contributions are welcome to the project. The curators try to review all pull requests as quickly as possible. However, this is a volunteer run project, so please be patient with it. If you are planning on submitting bigger changes to the project, please open a GitHub issue first and talk to the team before submitting to make sure your work will be accepted. 10 | 11 | Topics are located in the `content/topics` directory. Every topic contains an array of crates in the `extra` section of it's frontmatter: 12 | 13 | ``` 14 | +++ 15 | [extra] 16 | 17 | packages = [ 18 | "actix-web", 19 | "rocket" 20 | ] 21 | +++ 22 | ``` 23 | 24 | To add or remove crates from a topic, simple add or remove the crate from it's package array. For more detailed documentation, see [the contributing docs](./CONTRIBUTING.md). 25 | 26 | ## Code of Conduct 27 | 28 | ![](https://img.shields.io/badge/Code_of_Conduct-Contributor_Covenant-green.svg?style=flat-square) 29 | 30 | This project is managed under an adapted [Contributor Convenant](http://contributor-covenant.org/) Code of Conduct, applicable to everyone involved in the project (including core committers, maintainers and sponsors) in all forms of online and offline communication (public and private) as well as for all affiliated events and meetings. 31 | 32 | [Read the full Code of Conduct here](./CODE_OF_CONDUCT.md) 33 | 34 | ## License 35 | 36 | ![](https://img.shields.io/github/license/bashyHQ/arewewebyet.svg?style=flat-square) 37 | 38 | The project and all its work is published under the Creative Commons Attribution 4.0 International License. To learn more about the conditions of that License, please refer to the [LICENSE](LICENSE) document in this folder. 39 | 40 | The original work this project is largely inspired by, was done and published by [Chris Morgan](https://github.com/chris-morgan) under the Creative Commons Attribution License (his link suggests, version 3.0). 41 | -------------------------------------------------------------------------------- /sass/styles.scss: -------------------------------------------------------------------------------- 1 | @import "styles/_breakpoints"; 2 | @import "styles/_font-mixins"; 3 | 4 | @import "styles/authors"; 5 | @import "styles/base"; 6 | @import "styles/core"; 7 | @import "styles/fonts"; 8 | @import "styles/footer"; 9 | @import "styles/home"; 10 | @import "styles/level-indicator"; 11 | @import "styles/links"; 12 | @import "styles/news"; 13 | @import "styles/pkg"; 14 | @import "styles/topic"; 15 | 16 | .article { 17 | position: relative; 18 | overflow: hidden; 19 | margin: 3vh auto 1vh; 20 | 21 | @include for-tablet-landscape-up { 22 | max-width: 960px; 23 | margin: 0 auto; 24 | } 25 | } 26 | 27 | .article--banner-spacing { 28 | margin: 6rem auto 1rem; 29 | 30 | @include for-tablet-portrait-up { 31 | margin: 2rem auto 1rem; 32 | } 33 | 34 | @include for-tablet-landscape-up { 35 | margin: 0 auto; 36 | } 37 | } 38 | 39 | 40 | .alert-box { 41 | margin: 4em 0; 42 | font-size: 0.95em; 43 | border: 1px solid #eadc3d; 44 | padding: 0.5em 2em; 45 | background: #fefce7; 46 | } 47 | 48 | .review { 49 | font-size: 0.65em; 50 | } 51 | 52 | .review.positive, .review.recommendation { 53 | border-color: #d0e9c3; 54 | } 55 | 56 | .review.note { 57 | border-color: rgba(66, 139, 202, 0.36); 58 | } 59 | 60 | .review.warning { 61 | border-color: #E4B71B; 62 | } 63 | 64 | .review.negative { 65 | border-color: #E4771B; 66 | } 67 | 68 | .review.terrible { 69 | border-color: #E4371B; 70 | } 71 | 72 | .review:after { 73 | clear: both; 74 | content: ""; 75 | display: table; 76 | } 77 | 78 | .review cite { 79 | position: relative; 80 | padding-left: 5em; 81 | display: inline-block; 82 | } 83 | 84 | .review cite:before { 85 | content: "—"; 86 | font-size: 2em; 87 | font-style: italic; 88 | font-weight: 300; 89 | position: absolute; 90 | top: 50%; 91 | transform: translate(0, -50%); 92 | left: 1em; 93 | } 94 | 95 | .review cite img { 96 | height: 2em; 97 | vertical-align: middle; 98 | margin: 0.25em 1em 0.25em 0; 99 | border-radius: 50%; 100 | border: 1px solid #eee; 101 | } 102 | 103 | .review .name { 104 | font-size: 1.2em; 105 | font-weight: 400; 106 | display: inline; 107 | } 108 | 109 | .review p.info { 110 | margin: 0; 111 | } 112 | 113 | .review .version { 114 | font-weight: 400; 115 | } 116 | 117 | .review p { 118 | margin: 1em 0 0.5em; 119 | } 120 | 121 | .related-news { 122 | list-style: "» "; 123 | font-size: 0.8em; 124 | } 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | {% if page.title %}{{page.title}} » AWWY?{% else %}Are we web yet? Yes, and it's freaking fast! {% endif %} 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
    30 | 31 | {% block content %} {% endblock %} 32 |
    33 | 34 |
    35 |
    36 | 37 | 42 | 64 |
    65 |

    66 | {% set build_time = get_env(name="CURRENT_TIME", default=false) %} 67 | {% if build_time %} 68 | Last updated {{ build_time }} - 69 | {% endif %} 70 | 71 | CC-BY-4.0 72 |

    73 |
    74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /content/about.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "About AWWY" 3 | +++ 4 | 5 | ## About 6 | 7 | Are We Web Yet – or AWWY (pronounced _a-we?_) for short – tries to answer the question: **Can I use Rust to do web development (yet)?** 8 | 9 | ## How to use the site 10 | 11 | This website has various features that make your life easier researching whether you can use Rust for the web development already or not. While some stuff is possible already, other parts are still challenging and this website wants to give you insight for your particular case. The easiest is to start looking into the [topics](/topics/) most relevant for you. 12 | 13 | While most things should be rather quick to comprehend, there are some features, we'd like to explain to you a little deeper to improve the speed with which you can answer the question for you. 14 | 15 | ### The Package Info 16 | 17 | ![Package Info](/about/package-info.png) 18 | 19 | For each package we list the most important information in one quick view. Aside from the package id (`hyper`), the header shows various links – if available: the crate.io-page, the homepage, the documentation and to the source code. Tip: When you hover over name, it also shows when the package was created and last updated. 20 | 21 | In the second row features the latest published version number, how often the package has been downloaded so far and how it is licensed – all as pretty badges of live data pulled from [shields.io](http://shields.io/). 22 | 23 | Under that you can find the short description provided for that package. 24 | 25 | ### Understanding the level indicator 26 | 27 | Throughout the app – mostly on section titles – you find the small `level indicators`: a colored glyph, which should give you a hint on the maturity of the subject overall as designated by the [curators](/curators/). The following indicators are available: 28 | 29 | 38 | 39 | If you need a reminder, you can also just hover over the glyph to get the text. 40 | 41 | 42 | ## Credits 43 | 44 | This project is hosted and largely developed by [The Bashy](http://bashy.io/), specifically [Benjamin Kampmann](/curators/#ben). The content is curated by the [curators](/curators/). The first version was developed and hosted by [Chris Morgan](https://github.com/chris-morgan). All content is licensed under the [Creative Commons Attribution License (International)](https://github.com/bashyHQ/arewewebyet/blob/gh-pages/LICENSE). 45 | -------------------------------------------------------------------------------- /content/news/2017-08-11-announcing-gotham.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Announcing Gotham" 3 | date = 2017-08-11 4 | 5 | [extra] 6 | 7 | source = { author = "Bradley Beddoes (bradleybeddoes)", link = { url = "https://users.rust-lang.org/t/announcing-gotham/12307", name = "Rust Users Forum" } } 8 | 9 | tags = [ 10 | "framework", 11 | "announcement" 12 | ] 13 | +++ 14 | 15 | For the last eight months, we've been hard at work on a project that we're thrilled to be able to share with the wider Rust community. 16 | 17 | We know it as [Gotham](https://gotham.rs) and today we're releasing 0.1. 18 | 19 | Gotham is a flexible web framework that does not sacrifice safety, security or speed. The Gotham core team loves many of the elegant concepts that are found in dynamically typed web application frameworks, such as Rails/Phoenix/Django and aspire to achieve them with the type and memory safety guarantees provided by Rust. 20 | 21 | Gotham is stability focused. With our release of Gotham 0.1, we're compatible with Rust stable and every future release of Gotham will maintain that contract. Naturally, we build on beta and nightly as well so if you're on the bleeding edge Gotham is good to go. 22 | 23 | Gotham leverages async extensively thanks to the [Tokio project](https://tokio.rs) and is further enhanced by being built directly on top of async [Hyper](https://hyper.rs). Completing web requests in µs with almost non-existent memory footprints is still taking some getting used to. 24 | 25 | We wanted to get Gotham in the hands of the Rust community early with regular smaller iterations to follow. The Gotham 0.1 release includes the following features: 26 | 27 | * Handlers and Controllers 28 | * Advanced Routing 29 | * Type Safe Extractors 30 | * Middleware and Pipelines 31 | * Request State 32 | * Sessions 33 | * Request and Response helpers 34 | * Test helpers 35 | * Thoroughly documented code and the beginnings of a Gotham book 36 | 37 | There are some important features still to be built and we hope that the community will help us define even more. Right now our roadmap includes: 38 | 39 | * Enhancing our Router API with builders/macros to make this much more comfortable for folks used to defining routes in Rails or Phoenix 40 | * Compiled Templates 41 | * Form extraction 42 | * First class Diesel integration 43 | * Async static file serving 44 | * i18n 45 | * Hot reload during development 46 | * Structured logging 47 | 48 | You can find out more about Gotham at [https://gotham.rs](https://gotham.rs). We look forward to welcoming you into the Gotham community. 49 | 50 | Finally, we'd like to say a very sincere thank you to the developers and communities of every dependency we've built Gotham on top of, including of course, Rust itself. Your work is amazing and we could not have gotten here without it. We look forward to working with you all in the future. 51 | 52 | [@bradleybeddoes](https://users.rust-lang.org/u/bradleybeddoes) and 53 | [@smangelsdorf](https://users.rust-lang.org/u/smangelsdorf) 54 | -------------------------------------------------------------------------------- /content/topics/deploy.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Deployment" 3 | 4 | [extra] 5 | 6 | level = 3 7 | 8 | intro = "How is Rust deployment onto existing server infrastructures? Well, stuff is looking quite good actually." 9 | 10 | missing = [ 11 | "Google Cloud (App Engine, Functions, Run) Support", 12 | "Microsoft Azure Support", 13 | ] 14 | +++ 15 | 16 |

    Heroku {{ level(level=3) }}

    17 | 18 | [Heroku](https://www.heroku.com/) is a cloud PaaS tool that supports collections of languages. It does not support Rust natively, however, you can run Heroku with [github.com/emk/heroku-buildpack-rust](https://github.com/emk/heroku-buildpack-rust), a popular but unofficial buildpack. 19 | 20 |

    AWS Lambda{{ level(level=0) }}

    21 | 22 | [AWS Lambda](https://aws.amazon.com/lambda/) supports Rust natively with an [opensource runtime](https://github.com/awslabs/aws-lambda-rust-runtime)! There is also an unofficial but very popular AWS SDK, [rusoto](/topics/services/#pkg-rusoto_core). 23 | 24 |

    Docker {{ level(level=0) }}

    25 | 26 | There are [official docker images](https://github.com/rust-lang-nursery/docker-rust) for rust ([`rust`](https://hub.docker.com/_/rust/)) with over 10+ Million downloads! There are also nightly images ([`rustlang/rust`](https://hub.docker.com/r/rustlang/rust/)) if your application requires it. If you use docker's [multi-stage builds](https://docs.docker.com/develop/develop-images/multistage-build/), you can build your application binary and then copy it into a container. This allows you to avoid deploying the entire compilation toolchain with your web application. 27 | 28 |

    Cloud-Native Buildpacks {{ level(level=3) }}

    29 | 30 | [Cloud-Native Buildpacks](https://buildpacks.io/) is a CNCF project that provides a specification for automatically transforming source code into OCI images you can run on any cloud. Paketo Buildpacks, a popular implementation of the Cloud-Native Buildpacks specification, has a [Rust buildpack](https://github.com/paketo-community/rust/) that supports transforming your Rust source code into OCI images. 31 | 32 | Present features: pick your Rust version including nightly, automatically detects your binaries and configures the container to run them, supports projects with multiple binaries & workspace projects, supports installing additional tools via `cargo install`, can optionally install `tini` for proper pid1 handling, can generate images as small as a few MB plus your binaries, and loads of caching for fast rebuilds. 33 | 34 |

    Vercel {{ level(level=3) }}

    35 | 36 | [▲ Vercel](https://vercel.com/), (formerly Zeit) is a cloud platform for serverless functions. There is a community rust runtime, [vercel-rust](https://github.com/vercel-community/rust). 37 | 38 |

    Unikernels {{ level(level=2) }}

    39 | 40 | Unikernels are the rising star and newest hot thing to do big scale deployment. With Rust being a system language unikernels are an obvious approach to the problem and doing your research you'll find that there is a lot happening here indeed. There's a number of unikernels which support rust: 41 | 42 | - [nanos](https://github.com/nanovms/nanos) 43 | - [rumprun](https://github.com/rumpkernel/rumprun) with `--target x86_64-rumprun-netbsd` 44 | -------------------------------------------------------------------------------- /content/news/2014-06-04-7-high-priority-rust-libraries-that-need-to-be-written.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "7 high priority Rust libraries that need to be written" 3 | date = 2014-06-04 4 | 5 | [extra] 6 | 7 | source = { author = "Brian Anderson", link = { url = "https://mail.mozilla.org/pipermail/rust-dev/2014-June/010139.html", name = "rust-dev Mailinglist" } } 8 | 9 | tags = [ 10 | "database", 11 | "i18n", 12 | "crypto" 13 | ] 14 | +++ 15 | 16 | Greetings, all. 17 | 18 | Looking for ways to have an impact on Rust? The current plan for Rust 19 | defers the creation of some key libraries until after Rust 1.0, but that 20 | doesn't mean we can't start on them now if the interest is out there. 21 | Here are 7 libraries that need to be created soon rather than later. 22 | Since these are all destined to be either incorporated directly into the 23 | Rust distribution or to be officially-maintained cargo packages, and 24 | since they are targeted for inclusion in the post-1.0 timeframe, they 25 | need to be designed carefully and implemented thoroughly. 26 | 27 | ### [Internationalization](https://github.com/mozilla/rust/issues/14494) 28 | 29 | ECMA 402 is a standard for internationalization, dealing with the 30 | automatic conversion of various information based on locale. Rust's core 31 | libraries provide *no* internationalization. A core problem here will be 32 | determining how Rust should think about locales. 33 | 34 | ### [Localization](https://github.com/mozilla/rust/issues/14495) 35 | 36 | This may depend on the previous for locale support, if nothing else. 37 | This is largely about the human-assisted translation of strings. We 38 | would like to experiment with a new Moco-developed standard for this, 39 | called L20N. This project will be about figuring out how the L20N API 40 | can be adapted to Rust. 41 | 42 | ### [Unicode (ICU)](https://github.com/mozilla/rust/issues/14656) 43 | 44 | The exact path forward here may require a bit of discussion still, but I 45 | think the most viable approach starts with binding libicu and wrapping 46 | in a Rust API. 47 | 48 | ### [Date/Time](https://github.com/mozilla/rust/issues/14657) 49 | 50 | Our time crate is very minimal, and the API looks dated. This is a hard 51 | problem and JodaTime seems to be well regarded so let's just copy it. 52 | 53 | ### [HTTP](https://github.com/teepee/teepee) 54 | 55 | ChrisMorgan is leading an effort to implement HTTP for Rust and I'm sure 56 | he would love more contributions. 57 | 58 | ### [Crypto](https://github.com/mozilla/rust/issues/14655) 59 | 60 | We've previously made the decision not to distribute any crypto with 61 | Rust at all, but this is probably not tenable since crypto is used 62 | everywhere. My current opinion is that we should not distribute any 63 | crypto /written in Rust/, but that distributing bindings to proven 64 | crypto is fine. 65 | 66 | Figure out a strategy here, build consensus, then start implementing a 67 | robust crypto library out of tree, with the goal of merging into the 68 | main distribution someday, and possibly - far in the future - 69 | reimplementing in Rust. There are some existing efforts along these 70 | lines that should be evaluated for this purpose. 71 | 72 | There are a lot of people interested in, and working on, this subject, 73 | and crypto potentially interacts with many libraries (like HTTP) so 74 | coordination is needed. 75 | 76 | ### [SQL](https://github.com/mozilla/rust/issues/14658) 77 | 78 | Generic SQL bindings. I'm told SqlAlchemy core is a good system to learn 79 | from. 80 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at [INSERT EMAIL ADDRESS]. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /content/news/2016-02-16-we-are-back-baby.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "We are back, baby!" 3 | date = 2016-02-16 4 | 5 | [extra] 6 | 7 | source = { author = "ben" } 8 | +++ 9 | 10 | It has been long, since you heard from us. But we are back – with an all new shiny and new approach of trying to answer the question: 11 | 12 | [![Are We Web yet](/screenshot.png)](http://www.arewewebyet.org/) 13 | 14 | 15 | ## A relaunch was needed 16 | 17 | A lot has happened over the last year in Rust Web-Development since the first inception of AreWeWebYet. While some parts of the ecosystem grew quickly, others are still lacking in features, support and stability. But the sheer number of packages we'd have to list now, would make the website inaccessible and hard to maintain. It was time to rethink how we could answer the question differently. The rewrite of this website is reflecting that, by not only **giving a more nuanced answer** on its main page, but also **shed more light [into each separate topic](/topics/)** so you can take a more informed decision. 18 | 19 | ## More, detailed info 20 | 21 | ![Package Info](/about/package-info.png) 22 | 23 | Among other things the new website gives much deeper insight on faster glance than you might notice. All package information is regularly synced with crates.io, the badges are even pulled _live_ when you access the website. Each section has its own small indicator, giving you an idea of what the curators think about that particular part in one single glyph – [more details about those in the help section of the about page](/about/#how-to-use-the-site). 24 | 25 | 26 | 27 | ### Curated comments 28 | 29 | ![Comments](/about/comments-shown.png) 30 | 31 | But a version info and a package link don't necessarily say much about a project. At least not as much as an insight about the project from someone, who's used it. Which is why the new version of the website features comments by the curators or otherwise found on the web on a per package basis. Toggled off by default to keep the design clean, those allow you to catch a small glimpse into the inside of what means to use that package. 32 | 33 | 34 | ## A news section 35 | 36 | But the ecosystem is not slowing down, quite the contrary it is just getting started. And while the website is good for a quick glance at a specific point in time, it isn't particularly suited to keep up with the ever increasing pace of whats happening. This is why we also launched a [News section](/news/) and invite everyone to share their updates and news with us and the wider audience. 37 | 38 | And if you are interested to stay up to date with news from the Rust Web Ecosystem, we know offer a nice and clean [RSS-Feed for your convenience](/atom.xml). 39 | 40 | ## Under new management 41 | 42 | One other change you might have noticed is that we moved to a `.org` domain, under the umbrella of the [Bashy Organisation](http://bashy.io/). This reflects **the new, open approach** in ensuring the website stays current with latest development. We moved it from its previous hosting provider (which only a selected few had access to) to Github-Pages, re-rendering the page with every Pull-Request merged or change made, and we are actively seeking for more people to help us maintain and curate the content. 43 | 44 | We run the project under the [Contributor Covenant Code of Conduct](https://github.com/bashyHQ/arewewebyet/blob/gh-pages/CODE_OF_CONDUCT.md) and have a rather relaxed policy on giving curator-positions to others. If you are interested, please take a look at the [Contributing Guidelines](https://github.com/bashyHQ/arewewebyet/blob/gh-pages/CONTRIBUTING.md). We are looking forward to your contributions! 45 | -------------------------------------------------------------------------------- /static/gh-fork-ribbon.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License 3 | * https://github.com/simonwhitaker/github-fork-ribbon-css 4 | */ 5 | 6 | /* Left will inherit from right (so we don't need to duplicate code) */ 7 | .github-fork-ribbon { 8 | /* The right and left classes determine the side we attach our banner to */ 9 | position: absolute; 10 | 11 | /* Add a bit of padding to give some substance outside the "stitching" */ 12 | padding: 2px 0; 13 | 14 | /* Set the base colour */ 15 | background-color: #a00; 16 | 17 | /* Set a gradient: transparent black at the top to almost-transparent black at the bottom */ 18 | background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15))); 19 | background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); 20 | background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); 21 | background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); 22 | background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); 23 | background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); 24 | 25 | /* Add a drop shadow */ 26 | -webkit-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5); 27 | -moz-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5); 28 | box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5); 29 | 30 | /* Set the font */ 31 | font: 700 13px "Helvetica Neue", Helvetica, Arial, sans-serif; 32 | 33 | z-index: 9999; 34 | pointer-events: auto; 35 | } 36 | 37 | .github-fork-ribbon a, 38 | .github-fork-ribbon a:hover { 39 | /* Set the text properties */ 40 | color: #fff; 41 | text-decoration: none; 42 | text-shadow: 0 -1px rgba(0, 0, 0, 0.5); 43 | text-align: center; 44 | 45 | /* Set the geometry. If you fiddle with these you'll also need 46 | to tweak the top and right values in .github-fork-ribbon. */ 47 | width: 200px; 48 | line-height: 20px; 49 | 50 | /* Set the layout properties */ 51 | display: inline-block; 52 | padding: 2px 0; 53 | 54 | /* Add "stitching" effect */ 55 | border-width: 1px 0; 56 | border-style: dotted; 57 | border-color: #fff; 58 | border-color: rgba(255, 255, 255, 0.7); 59 | } 60 | 61 | .github-fork-ribbon-wrapper { 62 | width: 150px; 63 | height: 150px; 64 | position: absolute; 65 | overflow: hidden; 66 | top: 0; 67 | z-index: 9999; 68 | pointer-events: none; 69 | } 70 | 71 | .github-fork-ribbon-wrapper.fixed { 72 | position: fixed; 73 | } 74 | 75 | .github-fork-ribbon-wrapper.left { 76 | left: 0; 77 | } 78 | 79 | .github-fork-ribbon-wrapper.right { 80 | right: 0; 81 | } 82 | 83 | .github-fork-ribbon-wrapper.left-bottom { 84 | position: fixed; 85 | top: inherit; 86 | bottom: 0; 87 | left: 0; 88 | } 89 | 90 | .github-fork-ribbon-wrapper.right-bottom { 91 | position: fixed; 92 | top: inherit; 93 | bottom: 0; 94 | right: 0; 95 | } 96 | 97 | .github-fork-ribbon-wrapper.right .github-fork-ribbon { 98 | top: 42px; 99 | right: -43px; 100 | 101 | -webkit-transform: rotate(45deg); 102 | -moz-transform: rotate(45deg); 103 | -ms-transform: rotate(45deg); 104 | -o-transform: rotate(45deg); 105 | transform: rotate(45deg); 106 | } 107 | 108 | .github-fork-ribbon-wrapper.left .github-fork-ribbon { 109 | top: 42px; 110 | left: -43px; 111 | 112 | -webkit-transform: rotate(-45deg); 113 | -moz-transform: rotate(-45deg); 114 | -ms-transform: rotate(-45deg); 115 | -o-transform: rotate(-45deg); 116 | transform: rotate(-45deg); 117 | } 118 | 119 | 120 | .github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon { 121 | top: 80px; 122 | left: -43px; 123 | 124 | -webkit-transform: rotate(45deg); 125 | -moz-transform: rotate(45deg); 126 | -ms-transform: rotate(45deg); 127 | -o-transform: rotate(45deg); 128 | transform: rotate(45deg); 129 | } 130 | 131 | .github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon { 132 | top: 80px; 133 | right: -43px; 134 | 135 | -webkit-transform: rotate(-45deg); 136 | -moz-transform: rotate(-45deg); 137 | -ms-transform: rotate(-45deg); 138 | -o-transform: rotate(-45deg); 139 | transform: rotate(-45deg); 140 | } 141 | -------------------------------------------------------------------------------- /static/fonts/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ 2 | with Reserved Font Name Fira Sans. 3 | 4 | Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ 5 | with Reserved Font Name Fira Mono. 6 | 7 | Copyright (c) 2014, Telefonica S.A. 8 | 9 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 10 | This license is copied below, and is also available with a FAQ at: 11 | http://scripts.sil.org/OFL 12 | 13 | 14 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 15 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 16 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 17 | 18 | PREAMBLE 19 | The goals of the Open Font License (OFL) are to stimulate worldwide 20 | development of collaborative font projects, to support the font creation 21 | efforts of academic and linguistic communities, and to provide a free and 22 | open framework in which fonts may be shared and improved in partnership 23 | with others. 24 | 25 | The OFL allows the licensed fonts to be used, studied, modified and 26 | redistributed freely as long as they are not sold by themselves. The 27 | fonts, including any derivative works, can be bundled, embedded, 28 | redistributed and/or sold with any software provided that any reserved 29 | names are not used by derivative works. The fonts and derivatives, 30 | however, cannot be released under any other type of license. The 31 | requirement for fonts to remain under this license does not apply 32 | to any document created using the fonts or their derivatives. 33 | 34 | DEFINITIONS 35 | "Font Software" refers to the set of files released by the Copyright 36 | Holder(s) under this license and clearly marked as such. This may 37 | include source files, build scripts and documentation. 38 | 39 | "Reserved Font Name" refers to any names specified as such after the 40 | copyright statement(s). 41 | 42 | "Original Version" refers to the collection of Font Software components as 43 | distributed by the Copyright Holder(s). 44 | 45 | "Modified Version" refers to any derivative made by adding to, deleting, 46 | or substituting -- in part or in whole -- any of the components of the 47 | Original Version, by changing formats or by porting the Font Software to a 48 | new environment. 49 | 50 | "Author" refers to any designer, engineer, programmer, technical 51 | writer or other person who contributed to the Font Software. 52 | 53 | PERMISSION & CONDITIONS 54 | Permission is hereby granted, free of charge, to any person obtaining 55 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 56 | redistribute, and sell modified and unmodified copies of the Font 57 | Software, subject to the following conditions: 58 | 59 | 1) Neither the Font Software nor any of its individual components, 60 | in Original or Modified Versions, may be sold by itself. 61 | 62 | 2) Original or Modified Versions of the Font Software may be bundled, 63 | redistributed and/or sold with any software, provided that each copy 64 | contains the above copyright notice and this license. These can be 65 | included either as stand-alone text files, human-readable headers or 66 | in the appropriate machine-readable metadata fields within text or 67 | binary files as long as those fields can be easily viewed by the user. 68 | 69 | 3) No Modified Version of the Font Software may use the Reserved Font 70 | Name(s) unless explicit written permission is granted by the corresponding 71 | Copyright Holder. This restriction only applies to the primary font name as 72 | presented to the users. 73 | 74 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 75 | Software shall not be used to promote, endorse or advertise any 76 | Modified Version, except to acknowledge the contribution(s) of the 77 | Copyright Holder(s) and the Author(s) or with their explicit written 78 | permission. 79 | 80 | 5) The Font Software, modified or unmodified, in part or in whole, 81 | must be distributed entirely under this license, and must not be 82 | distributed under any other license. The requirement for fonts to 83 | remain under this license does not apply to any document created 84 | using the Font Software. 85 | 86 | TERMINATION 87 | This license becomes null and void if any of the above conditions are 88 | not met. 89 | 90 | DISCLAIMER 91 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 92 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 93 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 94 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 95 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 96 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 97 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 98 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 99 | OTHER DEALINGS IN THE FONT SOFTWARE. 100 | -------------------------------------------------------------------------------- /content/news/2016-03-08-introducing-pencil.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Introducing Pencil: A Microframework Inspired By Flask For Rust" 3 | date = 2016-03-08 4 | 5 | [extra] 6 | 7 | source = { author = "Shipeng Feng (_fengsp)", link = { url = "https://fengsp.github.io/blog/2016/3/introducing-pencil/", name = "Shipeng Feng's blog" } } 8 | +++ 9 | 10 | ## A Minimal Application 11 | 12 | ```rust 13 | extern crate pencil; 14 | 15 | use pencil::{Pencil, Request, Response, PencilResult}; 16 | 17 | fn hello(_: &mut Request) -> PencilResult { 18 | Ok(Response::from("Hello World!")) 19 | } 20 | 21 | fn main() { 22 | let mut app = Pencil::new("/web/hello"); 23 | app.get("/", "hello", hello); 24 | app.run("127.0.0.1:5000"); 25 | } 26 | ``` 27 | 28 | ## Routing 29 | 30 | ```rust 31 | fn user(r: &mut Request) -> PencilResult { 32 | let user_id = r.view_args.get("user_id").unwrap(); 33 | Ok(format!("user {}", user_id).into()) 34 | } 35 | 36 | fn main() { 37 | // app here 38 | app.get("/user/", "user", user); 39 | } 40 | ``` 41 | 42 | ## JSON Handling 43 | 44 | ```rust 45 | use std::collections::BTreeMap; 46 | use pencil::jsonify; 47 | 48 | fn app_info(_: &mut Request) -> PencilResult { 49 | let mut d = BTreeMap::new(); 50 | d.insert("name", "hello"); 51 | d.insert("version", "0.1.0"); 52 | return jsonify(&d); 53 | } 54 | 55 | fn main() { 56 | // app here 57 | app.get("/info", "app_info", app_info); 58 | } 59 | ``` 60 | 61 | ## Error Handling 62 | 63 | ```rust 64 | use pencil::HTTPError; 65 | 66 | fn page_not_found(_: HTTPError) -> PencilResult { 67 | let mut response = Response::from("Customized 404 :)"); 68 | response.status_code = 404; 69 | Ok(response) 70 | } 71 | 72 | fn main() { 73 | // app here 74 | app.httperrorhandler(404, page_not_found); 75 | } 76 | ``` 77 | 78 | ## Static Files 79 | 80 | Just create the static folder under your application root path, it just works. 81 | Now you can visit http://localhost:5000/static/example.png and get your file. 82 | You can customize the static folder and static url path. 83 | 84 | ```rust 85 | fn main() { 86 | // app here 87 | app.enable_static_file_handling(); 88 | } 89 | ``` 90 | 91 | ## Templating 92 | 93 | Just create the templates folder under your application root path, it just works. 94 | You can customize the template folder. 95 | 96 | ```html+jinja 97 | 98 | 99 | 100 |

    101 | Hello {{ name }}! 102 |

    103 | 104 | 105 | ``` 106 | 107 | ```rust 108 | fn hello_template(request: &mut Request) -> PencilResult { 109 | let mut context = BTreeMap::new(); 110 | context.insert("name".to_string(), "template".to_string()); 111 | return request.app.render_template("hello.html", &context); 112 | } 113 | 114 | fn main() { 115 | // app here 116 | app.register_template("hello.html"); 117 | app.get("/hello_template", "hello_template", hello_template); 118 | } 119 | ``` 120 | 121 | ## Logging 122 | 123 | ```rust 124 | #[macro_use] extern crate log; 125 | extern crate env_logger; 126 | 127 | fn main() { 128 | // app here 129 | app.set_debug(true); 130 | app.set_log_level(); 131 | env_logger::init().unwrap(); 132 | debug!("* Running on http://localhost:5000/"); 133 | app.run("127.0.0.1:5000"); 134 | } 135 | ``` 136 | 137 | ## Redirects And Errors 138 | 139 | ```rust 140 | use pencil::{redirect, abort}; 141 | 142 | fn github(_: &mut Request) -> PencilResult { 143 | return redirect("https://github.com/", 302); 144 | } 145 | 146 | fn login(_: &mut Request) -> PencilResult { 147 | return abort(401); 148 | } 149 | 150 | fn main() { 151 | // app here 152 | app.get("/github", "github", github); 153 | app.get("/login", "login", login); 154 | } 155 | ``` 156 | 157 | ## Request And Response Objects 158 | 159 | They are really easy to use, check docs for more details. 160 | 161 | ```rust 162 | fn search(request: &mut Request) -> PencilResult { 163 | let keyword = match request.args().get("q") { 164 | Some(q) => q as &str, 165 | None => "", 166 | }; 167 | Ok(Response::from(format!("You are searching for {}", keyword))) 168 | } 169 | 170 | fn main() { 171 | // app here 172 | app.get("/search", "search", search); 173 | } 174 | ``` 175 | 176 | ## Before/After Request 177 | 178 | ```rust 179 | extern crate typemap; 180 | 181 | use typemap::Key; 182 | 183 | struct KeyType; 184 | struct Value(i32); 185 | impl Key for KeyType { type Value = Value; } 186 | 187 | fn before_request(request: &mut Request) -> Option { 188 | request.extensions_data.insert::(Value(100)); 189 | None 190 | } 191 | 192 | fn main() { 193 | // app here 194 | app.before_request(before_request); 195 | } 196 | ``` 197 | 198 | ## Modular Applications 199 | 200 | ```rust 201 | use pencil::method::Get; 202 | use pencil::Module; 203 | 204 | fn hi_module(_: &mut Request) -> PencilResult { 205 | Ok("Hi module.".into()) 206 | } 207 | 208 | fn main() { 209 | // app here 210 | let mut demo_module = Module::new("demo", "/web/hello/demo"); 211 | demo_module.route("/demo/hi", &[Get], "hi", hi_module); 212 | app.register_module(demo_module); 213 | } 214 | ``` 215 | 216 | ## Links 217 | 218 | - [Project Home](https://github.com/fengsp/pencil) 219 | - [Documentation](http://fengsp.github.io/pencil/) 220 | - [Crates.io](https://crates.io/crates/pencil/) 221 | 222 | Have fun! 223 | -------------------------------------------------------------------------------- /scripts/JSON.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # FROM https://raw.githubusercontent.com/dominictarr/JSON.sh/master/JSON.sh 4 | # Licensed under MIT, see https://github.com/dominictarr/JSON.sh 5 | 6 | throw () { 7 | echo "$*" >&2 8 | exit 1 9 | } 10 | 11 | BRIEF=0 12 | LEAFONLY=0 13 | PRUNE=0 14 | NO_HEAD=0 15 | NORMALIZE_SOLIDUS=0 16 | 17 | usage() { 18 | echo 19 | echo "Usage: JSON.sh [-b] [-l] [-p] [-s] [-h]" 20 | echo 21 | echo "-p - Prune empty. Exclude fields with empty values." 22 | echo "-l - Leaf only. Only show leaf nodes, which stops data duplication." 23 | echo "-b - Brief. Combines 'Leaf only' and 'Prune empty' options." 24 | echo "-n - No-head. Do not show nodes that have no path (lines that start with [])." 25 | echo "-s - Remove escaping of the solidus symbol (stright slash)." 26 | echo "-h - This help text." 27 | echo 28 | } 29 | 30 | parse_options() { 31 | set -- "$@" 32 | local ARGN=$# 33 | while [ "$ARGN" -ne 0 ] 34 | do 35 | case $1 in 36 | -h) usage 37 | exit 0 38 | ;; 39 | -b) BRIEF=1 40 | LEAFONLY=1 41 | PRUNE=1 42 | ;; 43 | -l) LEAFONLY=1 44 | ;; 45 | -p) PRUNE=1 46 | ;; 47 | -n) NO_HEAD=1 48 | ;; 49 | -s) NORMALIZE_SOLIDUS=1 50 | ;; 51 | ?*) echo "ERROR: Unknown option." 52 | usage 53 | exit 0 54 | ;; 55 | esac 56 | shift 1 57 | ARGN=$((ARGN-1)) 58 | done 59 | } 60 | 61 | awk_egrep () { 62 | local pattern_string=$1 63 | 64 | gawk '{ 65 | while ($0) { 66 | start=match($0, pattern); 67 | token=substr($0, start, RLENGTH); 68 | print token; 69 | $0=substr($0, start+RLENGTH); 70 | } 71 | }' pattern="$pattern_string" 72 | } 73 | 74 | tokenize () { 75 | local GREP 76 | local ESCAPE 77 | local CHAR 78 | 79 | if echo "test string" | egrep -ao --color=never "test" &>/dev/null 80 | then 81 | GREP='egrep -ao --color=never' 82 | else 83 | GREP='egrep -ao' 84 | fi 85 | 86 | if echo "test string" | egrep -o "test" &>/dev/null 87 | then 88 | ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})' 89 | CHAR='[^[:cntrl:]"\\]' 90 | else 91 | GREP=awk_egrep 92 | ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})' 93 | CHAR='[^[:cntrl:]"\\\\]' 94 | fi 95 | 96 | local STRING="\"$CHAR*($ESCAPE$CHAR*)*\"" 97 | local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?' 98 | local KEYWORD='null|false|true' 99 | local SPACE='[[:space:]]+' 100 | 101 | $GREP "$STRING|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$" 102 | } 103 | 104 | parse_array () { 105 | local index=0 106 | local ary='' 107 | read -r token 108 | case "$token" in 109 | ']') ;; 110 | *) 111 | while : 112 | do 113 | parse_value "$1" "$index" 114 | index=$((index+1)) 115 | ary="$ary""$value" 116 | read -r token 117 | case "$token" in 118 | ']') break ;; 119 | ',') ary="$ary," ;; 120 | *) throw "EXPECTED , or ] GOT ${token:-EOF}" ;; 121 | esac 122 | read -r token 123 | done 124 | ;; 125 | esac 126 | [ "$BRIEF" -eq 0 ] && value=$(printf '[%s]' "$ary") || value= 127 | : 128 | } 129 | 130 | parse_object () { 131 | local key 132 | local obj='' 133 | read -r token 134 | case "$token" in 135 | '}') ;; 136 | *) 137 | while : 138 | do 139 | case "$token" in 140 | '"'*'"') key=$token ;; 141 | *) throw "EXPECTED string GOT ${token:-EOF}" ;; 142 | esac 143 | read -r token 144 | case "$token" in 145 | ':') ;; 146 | *) throw "EXPECTED : GOT ${token:-EOF}" ;; 147 | esac 148 | read -r token 149 | parse_value "$1" "$key" 150 | obj="$obj$key:$value" 151 | read -r token 152 | case "$token" in 153 | '}') break ;; 154 | ',') obj="$obj," ;; 155 | *) throw "EXPECTED , or } GOT ${token:-EOF}" ;; 156 | esac 157 | read -r token 158 | done 159 | ;; 160 | esac 161 | [ "$BRIEF" -eq 0 ] && value=$(printf '{%s}' "$obj") || value= 162 | : 163 | } 164 | 165 | parse_value () { 166 | local jpath="${1:+$1,}$2" isleaf=0 isempty=0 print=0 167 | case "$token" in 168 | '{') parse_object "$jpath" ;; 169 | '[') parse_array "$jpath" ;; 170 | # At this point, the only valid single-character tokens are digits. 171 | ''|[!0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;; 172 | *) value=$token 173 | # if asked, replace solidus ("\/") in json strings with normalized value: "/" 174 | [ "$NORMALIZE_SOLIDUS" -eq 1 ] && value=${value//\\\//\/} 175 | isleaf=1 176 | [ "$value" = '""' ] && isempty=1 177 | ;; 178 | esac 179 | [ "$value" = '' ] && return 180 | [ "$NO_HEAD" -eq 1 ] && [ -z "$jpath" ] && return 181 | 182 | [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 0 ] && print=1 183 | [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && [ $PRUNE -eq 0 ] && print=1 184 | [ "$LEAFONLY" -eq 0 ] && [ "$PRUNE" -eq 1 ] && [ "$isempty" -eq 0 ] && print=1 185 | [ "$LEAFONLY" -eq 1 ] && [ "$isleaf" -eq 1 ] && \ 186 | [ $PRUNE -eq 1 ] && [ $isempty -eq 0 ] && print=1 187 | [ "$print" -eq 1 ] && printf "[%s]\t%s\n" "$jpath" "$value" 188 | : 189 | } 190 | 191 | parse () { 192 | read -r token 193 | parse_value 194 | read -r token 195 | case "$token" in 196 | '') ;; 197 | *) throw "EXPECTED EOF GOT $token" ;; 198 | esac 199 | } 200 | 201 | if ([ "$0" = "$BASH_SOURCE" ] || ! [ -n "$BASH_SOURCE" ]); 202 | then 203 | parse_options "$@" 204 | tokenize | parse 205 | fi 206 | 207 | # vi: expandtab sw=2 ts=2 208 | -------------------------------------------------------------------------------- /content/news/2016-03-14-RustWebDigest-1-Getting-Started-Servo.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "RustWebDigest #1: Getting Started Section, Servo this summer, iron session" 3 | 4 | [extra] 5 | 6 | source = { author = "ben" } 7 | 8 | tags = [ 9 | "frameworks", 10 | "servo", 11 | "digest" 12 | ] 13 | +++ 14 | 15 | About a month has passed since we relaunched [AreWeWebYet](http://www.arewewebyet.org/) and quite a few news and updates made the rounds. To make it easier for you to stay up to date with current developments in Rust-Web, we decided to launch the RustWebDigest – a semi regular blog series from the AWWY curators on the state of affairs and changes since the last update. Welcome to edition #1. 16 | 17 | ## Getting started just got easier 18 | 19 | We've added a [new "Getting Started" section to the homepage](/#getting-started) to highlight great resources to make it easier for you get into rust web development. One especially important news in there was the [launch of the clippy service by the Bashy Initiative](http://www.bashy.io/news/2016/03/05/clippy-linting-as-a-service/), a rust linting service which ships [with 100% annotated source code](https://clippy.bashy.io/docs/) for everyone to learn from. 20 | 21 | ## Servo in Summer of code 22 | 23 | Servo was accepted to both Google Summer of Code and Rails Girls Summer of Code. If you are interested to join either program, take a [look at the announcement blog post for more info](https://blog.servo.org/2016/03/02/summer-of-code/) 24 | 25 | ## rust-url approaches v1 26 | 27 | In other news from the servo project, the famous Rust-URL-Crate for URL parsing and handling is approaching version 1.0 and is [looking for feedback on their API design and data structures](https://github.com/servo/rust-url/pull/176). 28 | 29 | ## Crate releases 30 | 31 | ### Notable crates 32 | 33 | - Iron has published a middleware for session management, appropriately named: [iron_session](https://crates.io/crates/iron_session) and we've found our first login-module: [iron-login](https://crates.io/crates/iron-login) 34 | - [oppgave](https://crates.io/crates/oppgave) is a simple redis-based worker queue implementation – finally! 35 | - [polly](https://crates.io/crates/polly) offers a truly logic-less templating language implementation in rust 36 | - With the latest rust release 1.7 [twox-hash](https://crates.io/crates/twox-hash) jumped a major version and released its version 1.0! 37 | 38 | ### Added to index: 39 | The following have been added to our tracking index (and the website where appropriate) 40 | 41 | - [polly](https://crates.io/crates/polly) (0.1.2) 42 | - [oppgave](https://crates.io/crates/oppgave) (0.1.0) 43 | - [hubcaps](https://crates.io/crates/hubcaps) (0.1.1) 44 | - [zip](https://crates.io/crates/zip) (0.1.16) 45 | - [robotparser](https://crates.io/crates/robotparser) (0.4.1) 46 | - [iron_session](https://crates.io/crates/iron_session) (0.0.4) 47 | - [iron-login](https://crates.io/crates/iron-login) (0.2.0) 48 | - [iron_vhosts](https://crates.io/crates/iron_vhosts) (0.1.0) 49 | - [staticdir](https://crates.io/crates/staticdir) (0.3.1) 50 | - [iron-hmac](https://crates.io/crates/iron-hmac) (0.3.0) 51 | - [iron-test](https://crates.io/crates/iron-test) (0.2.0) 52 | - [selective_middleware](https://crates.io/crates/selective_middleware) (0.1.0) 53 | - [persistent](https://crates.io/crates/persistent) (0.0.9) 54 | - [router](https://crates.io/crates/router) (0.1.0) 55 | - [staticfile](https://crates.io/crates/staticfile) (0.1.0) 56 | - [formdata](https://crates.io/crates/formdata) (0.7.9) 57 | - [mount](https://crates.io/crates/mount) (0.0.10) 58 | - [oven](https://crates.io/crates/oven) (0.2.16) 59 | - [static](https://crates.io/crates/static) (0.0.4) 60 | 61 | ### Updates recorded: 62 | 63 | Further more we recorded new releases to the following crates 64 | 65 | - [amqp](https://crates.io/crates/amqp) (0.0.13 => 0.0.15) 66 | - [blake2-rfc](https://crates.io/crates/blake2-rfc) (0.2.16 => 0.2.17) 67 | - [bodyparser](https://crates.io/crates/bodyparser) (0.1.0 => 0.2.0) 68 | - [cassandra](https://crates.io/crates/cassandra) (0.6.3 => 0.6.7) 69 | - [chrono](https://crates.io/crates/chrono) (0.2.19 => 0.2.20) 70 | - [clap](https://crates.io/crates/clap) (2.0.6 => 2.1.2) 71 | - [couchdb](https://crates.io/crates/couchdb) (0.5.0 => 0.5.1) 72 | - [crust](https://crates.io/crates/crust) (0.8.0 => 0.9.0) 73 | - [dbmigrate](https://crates.io/crates/dbmigrate) (0.2.1 => 0.2.2) 74 | - [discord](https://crates.io/crates/discord) (0.3.0 => 0.4.0) 75 | - [etcd](https://crates.io/crates/etcd) (0.3.0 => 0.3.1) 76 | - [handlebars-iron](https://crates.io/crates/handlebars-iron) (0.11.1 => 0.12.0) 77 | - [handlebars](https://crates.io/crates/handlebars) (0.14.0 => 0.15.0) 78 | - [influent](https://crates.io/crates/influent) (0.2.1 => 0.2.2) 79 | - [inth-oauth2](https://crates.io/crates/inth-oauth2) (0.7.0 => 0.8.0) 80 | - [jsonrpc](https://crates.io/crates/jsonrpc) (0.7.1 => 0.7.4) 81 | - [kafka](https://crates.io/crates/kafka) (0.1.8 => 0.2.0) 82 | - [keen](https://crates.io/crates/keen) (1.0.3 => 1.1.0) 83 | - [liquid](https://crates.io/crates/liquid) (0.3.0 => 0.4.1) 84 | - [lzw](https://crates.io/crates/lzw) (0.9.0 => 0.10.0) 85 | - [maud](https://crates.io/crates/maud) (0.7.4 => 0.8.0) 86 | - [multipart](https://crates.io/crates/multipart) (0.4.1 => 0.5.0-alpha.1) 87 | - [mysql](https://crates.io/crates/mysql) (1.2.1 => 2.1.0) 88 | - [pencil](https://crates.io/crates/pencil) (0.0.1 => 0.1.0) 89 | - [postgres](https://crates.io/crates/postgres) (0.11.1 => 0.11.4) 90 | - [rand](https://crates.io/crates/rand) (0.3.13 => 0.3.14) 91 | - [regex](https://crates.io/crates/regex) (0.1.48 => 0.1.55) 92 | - [robotparser](https://crates.io/crates/robotparser) (0.4.0 => 0.4.1) 93 | - [rotor-http](https://crates.io/crates/rotor-http) (0.5.0 => 0.6.0) 94 | - [rs-es](https://crates.io/crates/rs-es) (0.2.0 => 0.2.5) 95 | - [rusoto](https://crates.io/crates/rusoto) (0.12.0 => 0.12.1) 96 | - [rustful](https://crates.io/crates/rustful) (0.6.1 => 0.7.0) 97 | - [serde](https://crates.io/crates/serde) (0.6.11 => 0.7.0) 98 | - [serde_json](https://crates.io/crates/serde_json) (0.6.0 => 0.7.0) 99 | - [tar](https://crates.io/crates/tar) (0.4.0 => 0.4.4) 100 | - [telegram-bot](https://crates.io/crates/telegram-bot) (0.3.0 => 0.4.1) 101 | - [tempfile](https://crates.io/crates/tempfile) (2.1.0 => 2.1.1) 102 | - ✨ [twox-hash](https://crates.io/crates/twox-hash) (0.1.1 => 1.0.0) 103 | - [url](https://crates.io/crates/url) (0.5.5 => 0.5.7) 104 | - [urlparse](https://crates.io/crates/urlparse) (0.7.2 => 0.7.3) 105 | - [vkrs](https://crates.io/crates/vkrs) (0.5.0 => 0.6.1) 106 | - [websocket](https://crates.io/crates/websocket) (0.15.0 => 0.15.1) 107 | - [ws](https://crates.io/crates/ws) (0.4.4 => 0.4.5) 108 | 109 | 110 | Anything we missed? [Let us know](https://github.com/bashyHQ/arewewebyet/issues/new)! 111 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | All contributions are welcome to the project, the curators try to review all PRs as quickly as possible. 4 | Yet, this is a volunteer run project, so please be patient with it. If you are planning on submitting bigger 5 | changes to the projects, please open a github issue first and talk to the team before submitting to make 6 | sure your work will be accepted. 7 | 8 | The curators might reject any contribution without stating a reason, but especially if the contribution or 9 | contributor in question is not following the [code of conduct](./CODE_OF_CONDUCT.md) or doesn't follow the 10 | right procedure outlined below. 11 | 12 | ## Adding or Removing a package 13 | 14 | If a package isn't listed on the website yet, feel free to send us a pull-request if it satisfies the following requirements: 15 | 16 | - The package is related to the web-stack, open source and publicly available via [crates.io](https://crates.io) 17 | - The package's repository is not archived 18 | - The package is not flagged as unmaintained in [the Rust security advisory database](https://rustsec.org/) 19 | - The package has at least 4k recent downloads on [crates.io](https://crates.io) 20 | 21 | Packages are separated into separate `topics`. Topics are located in the `context/topics` directory. Every topic contains 22 | a TOML frontmatter, from which the HTML is generated: 23 | 24 | ``` 25 | +++ 26 | title = "Web Frameworks" 27 | 28 | [extra] 29 | 30 | packages = [ 31 | "actix-web", 32 | "rocket" 33 | ] 34 | +++ 35 | ``` 36 | 37 | To add or remove crates from a topic, simple add or remove the crate from it's package array (`extra.packages`). 38 | We won't list more than 10 entries for each topic. 39 | 40 | If you are in a hurry and don't have the time to prepare the PR, you can also submit an issue requesting for the 41 | package to be added. *Make sure you mark the issue with the `please-add`-tag*. 42 | 43 | And add a few words to the PR (or issue) about the package and why it should be listed (e.g. novel approach, 44 | popularity, first of its kind...). The more info we have (and the less work it is), the more likely it will be 45 | added soon. 46 | 47 | ## Submitting Project News 48 | 49 | You have an important announcement or latest news related to web development in rust and you'd like to share 50 | them with the wider audience of this website? GREAT, here is how you can do that: 51 | 52 | Just create a new file in `content/news` - we recommend to use Markdown. Make sure you set the `title`, the 53 | `date`, the `source` and add all appropriate `tags`. Once you are done, please submit all of that as a pull-request 54 | and we'll get right on it! 55 | 56 | ## Complaining about incorrect text 57 | 58 | Please open a github issue if you feel that anything is represented or out of date. Keep in mind that the description 59 | of a package is directly pulled from crates.io and won't be changed here. 60 | 61 | ## Local Development 62 | 63 | This project is hosted on github pages and uses the [Zola](https://www.getzola.org/). Zola is a static website 64 | compiler – it uses our data to generate a bunch of HTML pages. If you do not have zola yet, you can install it 65 | by using brew (`brew install zola`), snap (`snap install --edge zola`) or any other way 66 | [outlined on the official website](https://www.getzola.org/documentation/getting-started/installation/). 67 | 68 | To compile the documents, run from the main directory 69 | 70 | ```bash 71 | zola serve 72 | ``` 73 | 74 | Now open a browser on `http://localhost:1111` and you'll be able to see the homepage in its latest version. 75 | Any changes you make immediately rerender the websites after saving the file, you just need to refresh the 76 | browser. 77 | 78 | To generate a production build, run: 79 | 80 | ```bash 81 | zola build 82 | ``` 83 | 84 | ## Topic Levels 85 | 86 | Aside from it's title and intro, a topic also has the "maturity" level – an indicator from 0-6, which indicates how 87 | mature the curators believe this topic to be in rust (0 being the most mature and tested): 88 | 89 | ``` 90 | +++ 91 | title = "Templating" 92 | 93 | [extra] 94 | 95 | level = 0 96 | +++ 97 | ``` 98 | 99 | ## SubTopics 100 | 101 | Some topics do not have a `packages` array. These topics contain content after the frontmatter (after the second `+++`). 102 | Anything after the second `+++` is then rendered after the title in the top of the page, before the packages are listed. 103 | For example, the database topic is separated into `drivers`, and `orms`: 104 | ``` 105 | +++ 106 | [extra] 107 | 108 | drivers = [ 109 | "mysql", 110 | "postgres" 111 | ] 112 | 113 | orms = [ 114 | "diesel", 115 | "rustorm" 116 | ] 117 | +++ 118 | ``` 119 | 120 | These sub-topics are then rendered at the bottom of the page: 121 | ```html 122 |

    Drivers

    123 | 124 | {{ packages(packages='drivers') }} 125 | 126 |

    ORMs

    127 | 128 | {{ packages(packages='orms') }} 129 | ``` 130 | 131 | For more information about templating, see the `templating` below. 132 | 133 | ## Templating 134 | 135 | ### The `Level` Macro 136 | 137 | You can easily render the level indicator (colored and with the right icon) by including the `level.html` macro. It takes 138 | one parameter `level`, which is an integer from 0-5, anything else will be understood as "worse than 6". 139 | 140 | Example: 141 | 142 | ```html 143 | {% import "macros/level.html" as level %} 144 | 145 | {{ level::level(level=2) }} 146 | ``` 147 | 148 | Note that macros can only be used in templates (`.html`), not in markdown files. To get around this, we use 149 | [zola shortcodes](https://www.getzola.org/documentation/content/shortcodes/) that link to the corresponding macro. 150 | In markdown you do not need to import the file: 151 | 152 | ```markdown 153 | {{ level(level=2) }} 154 | ``` 155 | 156 | ### The `Package` Macro 157 | 158 | You can render the package `li` element at any point by just rendering the `package` macro. It takes one parameter `name`, 159 | which is the name of the package in question. 160 | 161 | Example: 162 | 163 | ```html 164 | {{ package(pkg_name=pkg_name) }} 165 | ``` 166 | 167 | ### The `Packages` Macro 168 | 169 | To render a list of packages as a `ul` block, just include the `packages` macro or shortcode. It takes one parameter 170 | `packages`, which is the list of names of packages. 171 | 172 | HTML Template Example: 173 | 174 | ```html 175 | {% import "macros/packages.html" as packages %} 176 | 177 | {{ packages::packages(packages=page.extra.packages) }} 178 | ``` 179 | 180 | In markdown, you can use the `packages` shortcode and pass in the name of the toml frontmatter array containing the packages: 181 | 182 | ``` 183 | +++ 184 | [extra] 185 | 186 | queries = [ 187 | "datafusion" 188 | ] 189 | +++ 190 | 191 | {{ packages(packages='queries') }} 192 | ``` 193 | 194 | ## Becoming a curator 195 | 196 | You want to help curate the listing? Awesome. Just open a issue on github, giving some info about you and why you want to join. 197 | -------------------------------------------------------------------------------- /templates/home.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/level.html" as level %} 3 | 4 | {% block content %} 5 | 6 |
    7 | 10 |
    11 | 12 |
    13 |

    Are we web yet?

    14 | 15 |

    Yes! And it's freaking fast!

    16 | 17 |

    18 | Rust has mature and production ready frameworks in Actix Web and 19 | Axum, and innovative ones like Warp 20 | and Tide. These provide everything you’d expect from a web framework, from routing 21 | and middleware, to templating, and JSON/form handling. There are crates for everything, and more! For databases, there’s:

    22 | 23 | 36 | 37 | {% set services = get_page(path="topics/services.md") %} 38 | There are many integrations to third-party services {{ level::level(level=services.extra.level) }}, such as: 39 | 40 | 54 | 55 | {% set logging = get_page(path="topics/logging.md") %} 56 | {% set auth = get_page(path="topics/auth.md") %} 57 | {% set templating = get_page(path="topics/templating.md") %} 58 | {% set email = get_page(path="topics/email.md") %} 59 | 60 |

    And of course, there is plenty of support for basic web needs, like logging 61 | {{ level::level(level=logging.extra.level) }}, authorization {{ level::level(level=auth.extra.level) }}, templating {{ level::level(level=templating.extra.level) }}, and email 63 | {{ level::level(level=email.extra.level) }}.

    64 | 65 | 66 |

    Can I replace my Rails/Django/Laravel app already?

    67 | 68 |

    69 | Rust does not have a dominant framework at the level of Django or Rails. Most Rust frameworks are smaller and modular, similar to Flask or Sinatra. 70 | Rust does have a diverse package ecosystem, but you generally have to wire everything up yourself. Expect to put in a little bit of extra set up work 71 | to get started. If you are expecting everything bundled up for you, then Rust might not be for you just yet. 72 |

    73 | 74 | {% set webassembly = get_page(path="topics/webassembly.md") %} 75 | 76 |

    WebAssembly???

    77 | 78 |

    Rust can run on the browser by compiling to WebAssembly 79 | {{ level::level(level=webassembly.extra.level) }}. This means that you can take advantage of the amazing Rust ecosystem on the browser! Rust and 80 | WebAssembly integrate with existing Javascript tooling like NPM, Webpack, and ECMAScript modules! There are 81 | some awesome Rust and WebAssembly projects out there. For example, Yew and Seed let you create 83 | front-end web apps with Rust in a way that feels almost like React.js.

    84 | 85 |

    For more information about Rust and WebAssembly, check out the Rust and WebAssembly Book.

    87 | 88 |

    Getting started

    89 | 90 |

    After you’ve set up your Rust and worked yourself through “The Book”, 91 | you might want to check any of these resources:

    92 | 93 | 105 | 106 |

    There are also some real world examples that can be looked at for reference:

    107 | 108 | 115 | 116 |

    If you find yourself stuck and looking for help, you can check out the official Rust forum, the Rust tag on Stackoverflow, or the Rust Discord server where you are welcome to post your questions and 120 | will find excellent help.

    121 | 122 |

    In detail

    123 | 124 |

    Learn more about the state of web development in Rust by topic:

    125 | 126 |
      127 | {% set section = get_section(path="topics/_index.md") %} 128 | {% for page in section.pages %} 129 |
    • {{page.title}} {{ level::level(level=page.extra.level) }}
    • 130 | {% endfor %} 131 |
    132 | 133 |
      134 |
    • {{ level::level(level=0) }}: everything is awesome: stable, tested and mature
    • 136 |
    • {{ level::level(level=1) }}: stuff's pretty great
    • 137 |
    • {{ level::level(level=2) }}: getting there, stable but still maturing
    • 138 |
    • {{ level::level(level=3) }}: not yet stable, but progressing
    • 139 |
    • {{ level::level(level=4) }}: unstable/incomplete, needs work
    • 140 |
    • {{ level::level(level=5) }}: barely there, needs serious work
    • 141 |
    • {{ level::level(level=6) }}: basically nonexistent
    • 142 |
    143 |
    144 | 145 | {% endblock content %} 146 | -------------------------------------------------------------------------------- /content/news/2016-11-20-RustWebDigest-4-i-wish-there-was-async-but-at-least-we-got-cms.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "RustWebDigest #4: I wish there was async, but at least we got CMSs!" 3 | 4 | [extra] 5 | 6 | source = { author = "ben" } 7 | 8 | tags = [ 9 | "async", 10 | "cms", 11 | "stack" 12 | ] 13 | +++ 14 | 15 | With the release of futures and soon after the Tokio-frameworks, this summer was async became all the range in the rust (web) world. While we were hoping to be able to start a new async-section and populate it with amazing libraries by now, even pushing down the timeframe of the digest itself, there isn't sufficient work on this (in the web area) yet. But in order to track these "in development"-things better, and also shed some light into it for people not familiar, we added another section to selected topics, called **upcoming**. 16 | 17 | Secondly, we also added another site tracking [Content Management Systems](/topics/cms/). While it currently also features only cobolt-bin (do you know some others?), it takes full advantage of the new upcoming feature and lets you know where you can help. 18 | 19 | 20 | ## Crate updates: 21 | 22 | 23 | ### Added to index: 24 | The following have been added to our tracking index (and the website where appropriate) 25 | 26 | - [atarashii_imap](https://crates.io/crates/atarashii_imap) (0.2.1) 27 | - [edge](https://crates.io/crates/edge) (0.0.1), [also see this comment by the author](https://github.com/bashyHQ/arewewebyet/pull/56#issuecomment-247916996) 28 | - [libphonenumber-sys](https://crates.io/crates/libphonenumber-sys) (0.1.1) 29 | - [cobalt](https://crates.io/crates/cobalt) (0.11.0) 30 | - [rouille](https://crates.io/crates/rouille) (0.2.2) 31 | - [rustls](https://crates.io/crates/rustls) (0.5.2) 32 | - [valico](https://crates.io/crates/valico) (1.0.1) 33 | 34 | 35 | ### Updates recorded: 36 | 37 | Further more we recorded new releases to the following crates 38 | ## Crates updates found: 39 | 40 | - [amqp](https://crates.io/crates/amqp) (0.0.16 => 0.0.19) 41 | - [argon2rs](https://crates.io/crates/argon2rs) (0.2.1 => 0.2.5) 42 | - [atom_syndication](https://crates.io/crates/atom_syndication) (0.1.4 => 0.3.0) 43 | - [backtrace](https://crates.io/crates/backtrace) (0.2.3 => 0.3.0) 44 | - [base64](https://crates.io/crates/base64) (0.2.0 => 0.2.1) 45 | - [bcrypt](https://crates.io/crates/bcrypt) (0.1.1 => 0.1.2) 46 | - **major** [bitsparrow](https://crates.io/crates/bitsparrow) (0.3.2 => 1.0.0) 47 | - [bodyparser](https://crates.io/crates/bodyparser) (0.4.0 => 0.4.1) 48 | - [brotli](https://crates.io/crates/brotli) (1.0.6 => 1.0.7) 49 | - [cassandra](https://crates.io/crates/cassandra) (0.7.2 => 0.7.3) 50 | - [chrono](https://crates.io/crates/chrono) (0.2.22 => 0.2.25) 51 | - [clap](https://crates.io/crates/clap) (2.9.3 => 2.18.0) 52 | - [conduit](https://crates.io/crates/conduit) (0.7.4 => 0.8.0) 53 | - [cookie](https://crates.io/crates/cookie) (0.2.5 => 0.3.1) 54 | - [crust](https://crates.io/crates/crust) (0.16.1 => 0.19.0) 55 | - [curl](https://crates.io/crates/curl) (0.3.1 => 0.4.1) 56 | - [dbmigrate](https://crates.io/crates/dbmigrate) (0.2.4 => 0.2.7) 57 | - [diesel](https://crates.io/crates/diesel) (0.6.2 => 0.8.1) 58 | - [discord](https://crates.io/crates/discord) (0.6.0 => 0.7.0) 59 | - [djangohashers](https://crates.io/crates/djangohashers) (0.2.2 => 0.2.5) 60 | - [docopt](https://crates.io/crates/docopt) (0.6.81 => 0.6.86) 61 | - [ease](https://crates.io/crates/ease) (0.5.0 => 0.6.1) 62 | - [encoding](https://crates.io/crates/encoding) (0.2.32 => 0.2.33) 63 | - [env_logger](https://crates.io/crates/env_logger) (0.3.4 => 0.3.5) 64 | - [etcd](https://crates.io/crates/etcd) (0.5.4 => 0.5.5) 65 | - [feed](https://crates.io/crates/feed) (1.2.3 => 1.2.4) 66 | - [flexi_logger](https://crates.io/crates/flexi_logger) (0.5.0 => 0.5.2) 67 | - [fnv](https://crates.io/crates/fnv) (1.0.3 => 1.0.5) 68 | - [formdata](https://crates.io/crates/formdata) (0.9.0 => 0.11.0) 69 | - **major** [ftp](https://crates.io/crates/ftp) (0.0.8 => 2.0.0) 70 | - [handlebars-iron](https://crates.io/crates/handlebars-iron) (0.15.3 => 0.19.2) 71 | - [handlebars](https://crates.io/crates/handlebars) (0.19.0 => 0.22.0) 72 | - [horrorshow](https://crates.io/crates/horrorshow) (0.5.6 => 0.6.1) 73 | - [hubcaps](https://crates.io/crates/hubcaps) (0.2.2 => 0.2.4) 74 | - [hyper](https://crates.io/crates/hyper) (0.9.10 => 0.9.12) 75 | - [influent](https://crates.io/crates/influent) (0.3.0 => 0.3.1) 76 | - [iron-hmac](https://crates.io/crates/iron-hmac) (0.3.3 => 0.4.0) 77 | - [iron-login](https://crates.io/crates/iron-login) (0.4.1 => 0.5.0) 78 | - [iron-test](https://crates.io/crates/iron-test) (0.3.0 => 0.4.0) 79 | - [json](https://crates.io/crates/json) (0.10.0 => 0.11.0) 80 | - [jsonrpc](https://crates.io/crates/jsonrpc) (0.7.6 => 0.8.0) 81 | - [jsonway](https://crates.io/crates/jsonway) (1.0.0 => 1.0.1) 82 | - [kafka](https://crates.io/crates/kafka) (0.4.1 => 0.5.0) 83 | - [keen](https://crates.io/crates/keen) (1.1.0 => 1.3.0) 84 | - [lettre](https://crates.io/crates/lettre) (0.5.1 => 0.6.1) 85 | - [liquid](https://crates.io/crates/liquid) (0.8.4 => 0.9.0) 86 | - [log4rs](https://crates.io/crates/log4rs) (0.4.8 => 0.5.0) 87 | - [logger](https://crates.io/crates/logger) (0.0.3 => 0.2.0) 88 | - [macaroons](https://crates.io/crates/macaroons) (0.2.1 => 0.3.1) 89 | - [maud](https://crates.io/crates/maud) (0.9.0 => 0.13.0) 90 | - [md5](https://crates.io/crates/md5) (0.1.1 => 0.2.1) 91 | - [mongodb](https://crates.io/crates/mongodb) (0.1.4 => 0.1.8) 92 | - [mongo_driver](https://crates.io/crates/mongo_driver) (0.3.0 => 0.4.0) 93 | - [mount](https://crates.io/crates/mount) (0.2.0 => 0.2.1) 94 | - [multipart](https://crates.io/crates/multipart) (0.7.0 => 0.9.0-alpha.2) 95 | - **major** [mysql](https://crates.io/crates/mysql) (5.2.2 => 7.1.2) 96 | - [nickel](https://crates.io/crates/nickel) (0.8.1 => 0.9.0) 97 | - [oauth2](https://crates.io/crates/oauth2) (0.1.10 => 0.2.0) 98 | - [oauth-client](https://crates.io/crates/oauth-client) (0.1.2 => 0.1.4) 99 | - [openssl](https://crates.io/crates/openssl) (0.7.14 => 0.9.1) 100 | - [oven](https://crates.io/crates/oven) (0.3.0 => 0.4.0) 101 | - [pencil](https://crates.io/crates/pencil) (0.2.1 => 0.3.0) 102 | - [persistent](https://crates.io/crates/persistent) (0.2.0 => 0.2.1) 103 | - [postgres](https://crates.io/crates/postgres) (0.11.9 => 0.13.1) 104 | - [queryst](https://crates.io/crates/queryst) (1.0.0 => 1.0.1) 105 | - [random](https://crates.io/crates/random) (0.12.1 => 0.12.2) 106 | - [regex](https://crates.io/crates/regex) (0.1.73 => 0.1.80) 107 | - [requests](https://crates.io/crates/requests) (0.0.22 => 0.0.25) 108 | - [ring](https://crates.io/crates/ring) (0.2.3 => 0.6.0-alpha) 109 | - [robotparser](https://crates.io/crates/robotparser) (0.4.4 => 0.8.0) 110 | - [rocksdb](https://crates.io/crates/rocksdb) (0.4.1 => 0.5.0-rc.1) 111 | - [router](https://crates.io/crates/router) (0.1.1 => 0.4.0) 112 | - [rs-es](https://crates.io/crates/rs-es) (0.4.6 => 0.6.0) 113 | - [rss](https://crates.io/crates/rss) (0.3.1 => 0.4.0) 114 | - [rusoto](https://crates.io/crates/rusoto) (0.15.3 => 0.18.1) 115 | - [rustache](https://crates.io/crates/rustache) (0.0.2 => 0.0.4) 116 | - [rustc-serialize](https://crates.io/crates/rustc-serialize) (0.3.19 => 0.3.21) 117 | - [rustless](https://crates.io/crates/rustless) (0.8.0 => 0.9.0) 118 | - [rustorm](https://crates.io/crates/rustorm) (0.5.4 => 0.5.6) 119 | - [schemamama](https://crates.io/crates/schemamama) (0.1.0 => 0.2.0) 120 | - [secp256k1](https://crates.io/crates/secp256k1) (0.5.4 => 0.6.0) 121 | - [sentry](https://crates.io/crates/sentry) (0.1.4 => 0.1.8) 122 | - [serde](https://crates.io/crates/serde) (0.8.0-rc3 => 0.8.17) 123 | - [serde_json](https://crates.io/crates/serde_json) (0.7.4 => 0.8.3) 124 | - [slog](https://crates.io/crates/slog) (0.6.0 => 1.3.0) 125 | - [staticfile](https://crates.io/crates/staticfile) (0.2.0 => 0.3.1) 126 | - [syndication](https://crates.io/crates/syndication) (0.2.0 => 0.4.0) 127 | - [tar](https://crates.io/crates/tar) (0.4.7 => 0.4.8) 128 | - [telegram-bot](https://crates.io/crates/telegram-bot) (0.4.2 => 0.5.0) 129 | - [tera](https://crates.io/crates/tera) (0.1.2 => 0.3.1) 130 | - [tiny-http](https://crates.io/crates/tiny-http) (0.5.2 => 0.5.5) 131 | - [urlencoded](https://crates.io/crates/urlencoded) (0.4.0 => 0.4.1) 132 | - [url](https://crates.io/crates/url) (1.1.1 => 1.2.3) 133 | - [uuid](https://crates.io/crates/uuid) (0.2.2 => 0.3.1) 134 | - [vkrs](https://crates.io/crates/vkrs) (0.6.2 => 0.6.3) 135 | - [webpki](https://crates.io/crates/webpki) (0.1.1 => 0.7.0) 136 | - [ws](https://crates.io/crates/ws) (0.5.1 => 0.5.3) 137 | - [yup-oauth2](https://crates.io/crates/yup-oauth2) (0.6.2 => 1.0.1) 138 | - [zip](https://crates.io/crates/zip) (0.1.17 => 0.2.0) 139 | - [zstd](https://crates.io/crates/zstd) (0.1.11 => 0.4.1) 140 | 141 | Anything we missed? [Let us know](https://github.com/bashyHQ/arewewebyet/issues/new)! -------------------------------------------------------------------------------- /content/news/2016-07-24-RustWebDigest-3-Authentication-Rest-and-more-learning.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "RustWebDigest #3: Authentication, Rust and Rest and more learning" 3 | 4 | [extra] 5 | 6 | source = { author = "ben" } 7 | 8 | tags = [ 9 | "logging", 10 | "rest" 11 | ] 12 | +++ 13 | 14 | The biggest news since the last RustWebDigest is without question the alpha release of Servo – the web rendering engine entirely written in Rust by Mozilla. It's a big effing deal and if you haven't downloaded it yet, I highly recommend doing so. While its still in alpha stage, it is very impressive what the team has delivered and keeps delivering with their nightly builds 👏. 15 | 16 | The second most widely spread news Armin Ronacher's – you know, the person behind Flask – blog post about doing nice [API development for Rest-APIs with Rust](http://lucumr.pocoo.org/2016/7/10/rust-rest/) that he encountered while implementing the Sentry Rust Client. Similarly big waves only received Dropbox for their [all rust brotli implementation, claiming to bring pied piper to life](https://blogs.dropbox.com/tech/2016/06/lossless-compression-with-brotli/), but weirdly only implementing _de_ compression so far. But both of sources of big credit showing strengths of Rust in very public posts, increasing the visibility and viability of Rust as decent web development environment. 17 | 18 | ## Authentication, remote logging 19 | 20 | After due consideration we've decided to rename the prior OAuth topic to a broader "Authentication/Authorization" topic as suggested by [Marcel Müller](https://github.com/TheNeikos). Thanks, Marcel, good idea! 21 | 22 | Making that topic more broad also allowed us to add more libraries to that area. [Go check it out](/topics/auth/). 23 | 24 | The second big change on the website is around logging: We've added slog (a structured logging facility) and a few remote logging implementations (sentry, airbrake) – very important tooling for every web developer! 25 | 26 | 27 | ## More Learning 28 | 29 | _Disclaimer: the author is co-organiser of RustFest._ 30 | 31 | ### Connecting RustFest and View Source 32 | 33 | More of a side note the [RustFest team announced their collaboration with Mozilla sponsored "View Source"](http://www.rustfest.eu/blog/this-week-in-rustfest-7-first-talks-and-viewsource), a conference dedicated to the open web. Within that side note, they announced to be hosting a discussion area about rust at View Source – reaching out to the web developer folks on their own turf. Despite not having announced any web-related talks at that conference, that's an important sign. I highly recommend to get in touch if you are interested making that discussion awesome. 34 | 35 | ### More blogs 36 | 37 | We've also seen a few more interesting blog posts about rust for web development and updates the main website accordingly: 38 | 39 | 40 | - [Rust and Rest](http://lucumr.pocoo.org/2016/7/10/rust-rest/) (as previously mentioned) 41 | - [REST in Rust](https://gsquire.github.io/static/post/rest-in-rust/) 42 | - [Connecting a webservice to a database in Rust](http://hermanradtke.com/2016/05/23/connecting-webservice-database-rust.html) 43 | 44 | ### arewewebyet/web development talk at Berlin Rust User Group 45 | 46 | And finally, you have the chance to see [me on stage this week at Berlin Rust User Group](http://www.meetup.com/Rust-Berlin/events/232583152/), trying to convince the folks in front of me to do web development with rust by implementing a tiny microservice with the help of arewewebyet. Come by and say hi! 47 | 48 | 49 | ## Crate updates: 50 | 51 | ### Added to index: 52 | The following have been added to our tracking index (and the website where appropriate) 53 | 54 | - [airbrake](https://crates.io/crates/airbrake) (0.1.0) 55 | - [brotli](https://crates.io/crates/brotli) (1.0.6) 56 | - [catapult](https://crates.io/crates/catapult) (0.1.2) 57 | - [frank_jwt](https://crates.io/crates/frank_jwt) (2.2.1) 58 | - [horrorshow](https://crates.io/crates/horrorshow) (0.5.6) 59 | - [macaroons](https://crates.io/crates/macaroons) (0.2.1) 60 | - [otpauth](https://crates.io/crates/otpauth) (0.2.5) 61 | - [slog](https://crates.io/crates/slog) (0.6.0) 62 | - [sentry](https://crates.io/crates/sentry) (0.1.4) 63 | - [zstd](https://crates.io/crates/zstd) (0.1.11) 64 | 65 | ### Updates recorded: 66 | 67 | Further more we recorded new releases to the following crates 68 | 69 | - [backtrace](https://crates.io/crates/backtrace) (0.2.1 => 0.2.3) 70 | - [base64](https://crates.io/crates/base64) (0.1.1 => 0.2.0) 71 | - [bodyparser](https://crates.io/crates/bodyparser) (0.3.0 => 0.4.0) 72 | - [cassandra](https://crates.io/crates/cassandra) (0.6.10 => 0.7.2) 73 | - [clap](https://crates.io/crates/clap) (2.5.1 => 2.9.3) 74 | - [cookie](https://crates.io/crates/cookie) (0.2.4 => 0.2.5) 75 | - [crust](https://crates.io/crates/crust) (0.14.0 => 0.16.1) 76 | - [curl](https://crates.io/crates/curl) (0.2.19 => 0.3.1) 77 | - [dbmigrate](https://crates.io/crates/dbmigrate) (0.2.3 => 0.2.4) 78 | - [discord](https://crates.io/crates/discord) (0.5.0 => 0.6.0) 79 | - [docopt](https://crates.io/crates/docopt) (0.6.80 => 0.6.81) 80 | - [ease](https://crates.io/crates/ease) (0.4.2 => 0.5.0) 81 | - [env_logger](https://crates.io/crates/env_logger) (0.3.3 => 0.3.4) 82 | - [etcd](https://crates.io/crates/etcd) (0.5.3 => 0.5.4) 83 | - _feedreader_ was renamed to [feed](https://crates.io/crates/feed) (1.2.3) 84 | - [fnv](https://crates.io/crates/fnv) (1.0.2 => 1.0.3) 85 | - [formdata](https://crates.io/crates/formdata) (0.8.2 => 0.9.0) 86 | - [ftp](https://crates.io/crates/ftp) (0.0.7 => 0.0.8) 87 | - [googl](https://crates.io/crates/googl) (0.0.3 => 0.0.4) 88 | - [handlebars-iron](https://crates.io/crates/handlebars-iron) (0.15.2 => 0.15.3) 89 | - [handlebars](https://crates.io/crates/handlebars) (0.16.1 => 0.19.0) 90 | - [hubcaps](https://crates.io/crates/hubcaps) (0.2.1 => 0.2.2) 91 | - [hyper](https://crates.io/crates/hyper) (0.9.6 => 0.9.10) 92 | - [imap](https://crates.io/crates/imap) (0.0.5 => 0.0.6) 93 | - [influent](https://crates.io/crates/influent) (0.2.2 => 0.3.0) 94 | - [iron](https://crates.io/crates/iron) (0.3.0 => 0.4.0) 95 | - [iron_vhosts](https://crates.io/crates/iron_vhosts) (0.1.0 => 0.2.0) 96 | - [json](https://crates.io/crates/json) (0.8.4 => 0.10.0) 97 | - [json_macros](https://crates.io/crates/json_macros) (0.3.0 => 0.3.2) 98 | - [jsonrpc](https://crates.io/crates/jsonrpc) (0.7.4 => 0.7.6) 99 | - [kafka](https://crates.io/crates/kafka) (0.3.1 => 0.4.1) 100 | - [libsodium-sys](https://crates.io/crates/libsodium-sys) (0.0.10 => 0.0.12) 101 | - [liquid](https://crates.io/crates/liquid) (0.8.0 => 0.8.4) 102 | - [log4rs](https://crates.io/crates/log4rs) (0.4.4 => 0.4.8) 103 | - [maud](https://crates.io/crates/maud) (0.8.1 => 0.9.0) 104 | - [mongo_driver](https://crates.io/crates/mongo_driver) (0.2.4 => 0.3.0) 105 | - [mount](https://crates.io/crates/mount) (0.1.0 => 0.2.0) 106 | - [mysql](https://crates.io/crates/mysql) (5.0.0 => 5.2.2) 107 | - [openssl](https://crates.io/crates/openssl) (0.7.13 => 0.7.14) 108 | - [pencil](https://crates.io/crates/pencil) (0.2.0 => 0.2.1) 109 | - [persistent](https://crates.io/crates/persistent) (0.1.0 => 0.2.0) 110 | - [pop3](https://crates.io/crates/pop3) (0.0.5 => 0.0.6) 111 | - [postgres](https://crates.io/crates/postgres) (0.11.7 => 0.11.9) 112 | - [random](https://crates.io/crates/random) (0.10.0 => 0.12.1) 113 | - [redis](https://crates.io/crates/redis) (0.5.3 => 0.7.0) 114 | - [regex](https://crates.io/crates/regex) (0.1.71 => 0.1.73) 115 | - [requests](https://crates.io/crates/requests) (0.0.10 => 0.0.22) 116 | - [rocksdb](https://crates.io/crates/rocksdb) (0.3.5 => 0.4.1) 117 | - [rs-es](https://crates.io/crates/rs-es) (0.3.4 => 0.4.6) 118 | - [rusoto](https://crates.io/crates/rusoto) (0.13.1 => 0.15.3) 119 | - [rusqlite](https://crates.io/crates/rusqlite) (0.7.2 => 0.7.3) 120 | - [rustache](https://crates.io/crates/rustache) (0.0.1 => 0.0.2) 121 | - [rustful](https://crates.io/crates/rustful) (0.8.0 => 0.9.0) 122 | - [rustorm](https://crates.io/crates/rustorm) (0.4.3 => 0.5.4) 123 | - [serde](https://crates.io/crates/serde) (0.7.5 => 0.8.0-rc3) 124 | - [serde_json](https://crates.io/crates/serde_json) (0.7.0 => 0.7.4) 125 | - [syndication](https://crates.io/crates/syndication) (0.1.1 => 0.2.0) 126 | - [syslog](https://crates.io/crates/syslog) (3.1.0 => 3.2.0) 127 | - [tar](https://crates.io/crates/tar) (0.4.5 => 0.4.7) 128 | - [tempfile](https://crates.io/crates/tempfile) (2.1.3 => 2.1.4) 129 | - [tera](https://crates.io/crates/tera) (0.1.1 => 0.1.2) 130 | - [tiny-http](https://crates.io/crates/tiny-http) (0.5.1 => 0.5.2) 131 | - [url](https://crates.io/crates/url) (1.1.0 => 1.1.1) 132 | - [urlencoded](https://crates.io/crates/urlencoded) (0.3.0 => 0.4.0) 133 | - [ws](https://crates.io/crates/ws) (0.4.7 => 0.5.1) 134 | - [yup-oauth2](https://crates.io/crates/yup-oauth2) (0.6.1 => 0.6.2) 135 | 136 | Anything we missed? [Let us know](https://github.com/bashyHQ/arewewebyet/issues/new)! 137 | -------------------------------------------------------------------------------- /content/news/2016-05-25-RustWebDigest-2-Learn-More-With-Blogs-And-Events.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "RustWebDigest #2: Learn More with Blogs and Events" 3 | 4 | [extra] 5 | 6 | source = { author = "ben" } 7 | 8 | tags = [ 9 | "frameworks", 10 | "digest", 11 | "events" 12 | ] 13 | +++ 14 | 15 | Great things have happened in the Rust(Web) Ecosphere since the first RustWebDigest was published about two months ago. You've probably figured by now that we are doing this digest on an irregular bases with a summary of news as we see fit. If you want to help us get these out more regularly, we are looking for more people to join the team! 16 | 17 | ## Events 18 | 19 | The announcement period for this years autumn conference season has come and it has blasting us all away with three major events dedicated to Rust. And all of them continue the trend to have another dedicated workshop day alongside their talk days. We hope to see plenty Web-Related Workshops there! 20 | 21 | It goes without saying that we'd love to have you send in a talk proposal (and workshop proposals!) – especially if you want to talk/teach about the Web! 22 | 23 | ### RustConf 24 | 25 | On **September 10th** there will be another official [RustConf](http://rustconf.com/) organised by the RustCore Team. It will take place in Portland, Oregon, USA. Further more, they also offer a day of training by the Rust Core Team if you come a day early. 26 | 27 | Tickets aren't available yet, but the [Call for Papers is still open until Jun 5th](http://cfp.rustconf.com/events/rustconf-2016). 28 | 29 | ### RustFest 30 | 31 | _(Disclaimer: The author is part of the organising team!)_ 32 | 33 | Following just a week later on Sept 17th [RustFest](http://www.rustfest.eu) will be the first dedicated Rust Conference on european grounds. Taking place in lovely, central Berlin this community conference will host one day of talks followed by a workshop day. 34 | 35 | Tickets aren't available yet either, however you still have until [June 20th to send in your talk proposal](https://cfp.rustfest.eu/authentications). 36 | 37 | ### Rust Belt Rust 38 | 39 | Last but not least, [Rust Belt Rust](http://www.rust-belt-rust.com/) will take place again October 29th & 28th in Pittsburgh, PA, USA. It also features one day of workshops, followed by a single track talks day. 40 | 41 | Although the latest in the year, the CfP is already closed. Tickets aren't available yet. Nothing to do other than staying tuned. 42 | 43 | ## More Example Blogs 44 | 45 | For those, who can't wait to learn about stuff at the conferences – and their official workshop days, you are in luck. Since the last publication, we've also seen an influx of new blog posts helping you get started with Rust Web. We've also restructured the Learn-More-Section on the website to allow space for more posts (ordered latest first). The latest additions are: 46 | 47 | - [Let's Build a Web Server in Rust](https://dfockler.github.io/2016/05/20/web-server.html) 48 | - [Creating a basic webservice in Rust](http://hermanradtke.com/2016/05/16/creating-a-basic-webservice-in-rust.html) 49 | - [Rust for Node.js developers](http://fredrik.anderzon.se/2016/05/10/rust-for-node-developers-part-1-introduction/) 50 | 51 | 52 | ### Notable crates 53 | 54 | [Sapper](https://github.com/sappworks/sapper) is not yet released as a crate but has already quite some impressive benchmarks, showing how Rust can boost Web a ton. [Sapper Works](https://github.com/sappworks) appears to want to build an entire ecosystem for "snappy" web development. We are excited to see what will come out of that! 55 | 56 | [Neon](http://calculist.org/blog/2015/12/23/neon-node-rust/) combines Node and Rust. It essentially allows you to write native code in rust, which can then easily interact with NodeJS. This is clearly web – somehow, but we aren't really sure where to put this in the category tree. If you have an idea, [let us know here](https://github.com/bashyHQ/arewewebyet/issues/31). 57 | 58 | [RustW](https://github.com/nrc/rustw) is a web frontend for the rust compiler. Allowing you to paste your code to a web-server and see the results (and errors) rendered in a webpage. 59 | 60 | [Hyper announced](http://seanmonstar.com/post/141495445652/async-hyper) they will be adding asynchronous IO – using our all beloved MIO. The branch mentioned in the blog post has even been merged now and it should be working with the latest release! 61 | 62 | ### Added to index: 63 | The following have been added to our tracking index (and the website where appropriate) 64 | 65 | - [bitsparrow](https://crates.io/crates/bitsparrow) (0.3.2) 66 | - [tera](https://crates.io/crates/tera) (0.1.1) 67 | - [frank_jwt](https://crates.io/crates/frank_jwt) (2.1.1) 68 | - [iron_json_response](https://crates.io/crates/iron_json_response) (0.1.1) 69 | - [log4rs](https://crates.io/crates/log4rs) (0.4.4) 70 | - [flexi_logger](https://crates.io/crates/flexi_logger) (0.5.0) 71 | 72 | ### Updates recorded: 73 | 74 | Further more we recorded new releases to the following crates 75 | 76 | - [amqp](https://crates.io/crates/amqp) (0.0.15 => 0.0.16) 77 | - [atom_syndication](https://crates.io/crates/atom_syndication) (0.1.3 => 0.1.4) 78 | - [backtrace](https://crates.io/crates/backtrace) (0.1.8 => 0.2.1) 79 | - [bcrypt](https://crates.io/crates/bcrypt) (0.1.0 => 0.1.1) 80 | - [bodyparser](https://crates.io/crates/bodyparser) (0.2.0 => 0.3.0) 81 | - [cassandra](https://crates.io/crates/cassandra) (0.6.7 => 0.6.10) 82 | - [chrono](https://crates.io/crates/chrono) (0.2.20 => 0.2.22) 83 | - [clap](https://crates.io/crates/clap) (2.1.2 => 2.5.1) 84 | - [cookie](https://crates.io/crates/cookie) (0.2.2 => 0.2.4) 85 | - [crust](https://crates.io/crates/crust) (0.9.0 => 0.14.0) 86 | - [curl](https://crates.io/crates/curl) (0.2.16 => 0.2.19) 87 | - [dbmigrate](https://crates.io/crates/dbmigrate) (0.2.2 => 0.2.3) 88 | - [diesel](https://crates.io/crates/diesel) (0.5.0 => 0.6.2) 89 | - [discord](https://crates.io/crates/discord) (0.4.0 => 0.5.0) 90 | - [djangohashers](https://crates.io/crates/djangohashers) (0.1.0 => 0.2.2) 91 | - [doapi](https://crates.io/crates/doapi) (0.1.2 => 0.1.3) 92 | - [docopt](https://crates.io/crates/docopt) (0.6.78 => 0.6.80) 93 | - [env_logger](https://crates.io/crates/env_logger) (0.3.2 => 0.3.3) 94 | - [etcd](https://crates.io/crates/etcd) (0.3.1 => 0.5.3) 95 | - [farmhash](https://crates.io/crates/farmhash) (1.1.4 => 1.1.5) 96 | - [fastcgi](https://crates.io/crates/fastcgi) (1.0.0-alpha.3 => 1.0.0-beta) 97 | - [flate2](https://crates.io/crates/flate2) (0.2.13 => 0.2.14) 98 | - [formdata](https://crates.io/crates/formdata) (0.7.9 => 0.8.2) 99 | - [gettext](https://crates.io/crates/gettext) (0.1.0 => 0.2.0) 100 | - [handlebars-iron](https://crates.io/crates/handlebars-iron) (0.12.0 => 0.15.2) 101 | - [handlebars](https://crates.io/crates/handlebars) (0.15.0 => 0.16.1) 102 | - [http2parse](https://crates.io/crates/http2parse) (0.2.1 => 0.2.2) 103 | - [hubcaps](https://crates.io/crates/hubcaps) (0.1.1 => 0.2.1) 104 | - [hyper](https://crates.io/crates/hyper) (0.7.2 => 0.9.6) 105 | - [inflate](https://crates.io/crates/inflate) (0.1.0 => 0.1.1) 106 | - [inth-oauth2](https://crates.io/crates/inth-oauth2) (0.8.0 => 0.10.0) 107 | - [iron-hmac](https://crates.io/crates/iron-hmac) (0.3.0 => 0.3.3) 108 | - [iron-login](https://crates.io/crates/iron-login) (0.2.0 => 0.4.1) 109 | - [iron-test](https://crates.io/crates/iron-test) (0.2.0 => 0.3.0) 110 | - [iron](https://crates.io/crates/iron) (0.2.6 => 0.3.0) 111 | - [jsonway](https://crates.io/crates/jsonway) (0.3.5 => 1.0.0) 112 | - [kafka](https://crates.io/crates/kafka) (0.2.0 => 0.3.1) 113 | - [libsodium-sys](https://crates.io/crates/libsodium-sys) (0.0.9 => 0.0.10) 114 | - [liquid](https://crates.io/crates/liquid) (0.4.1 => 0.8.0) 115 | - [log](https://crates.io/crates/log) (0.3.5 => 0.3.6) 116 | - [maud](https://crates.io/crates/maud) (0.8.0 => 0.8.1) 117 | - [mongo_driver](https://crates.io/crates/mongo_driver) (0.2.2 => 0.2.4) 118 | - [mongodb](https://crates.io/crates/mongodb) (0.1.3 => 0.1.4) 119 | - [mount](https://crates.io/crates/mount) (0.0.10 => 0.1.0) 120 | - [multipart](https://crates.io/crates/multipart) (0.5.0-alpha.1 => 0.7.0) 121 | - [mysql](https://crates.io/crates/mysql) (2.1.0 => 5.0.0) 122 | - [names](https://crates.io/crates/names) (0.10.0 => 0.11.0) 123 | - [nickel](https://crates.io/crates/nickel) (0.7.3 => 0.8.1) 124 | - [oauth2](https://crates.io/crates/oauth2) (0.1.9 => 0.1.10) 125 | - [openssl](https://crates.io/crates/openssl) (0.7.6 => 0.7.13) 126 | - [oven](https://crates.io/crates/oven) (0.2.16 => 0.3.0) 127 | - [pencil](https://crates.io/crates/pencil) (0.1.0 => 0.2.0) 128 | - [persistent](https://crates.io/crates/persistent) (0.0.9 => 0.1.0) 129 | - [postgres](https://crates.io/crates/postgres) (0.11.4 => 0.11.7) 130 | - [queryst](https://crates.io/crates/queryst) (0.1.16 => 1.0.0) 131 | - [random](https://crates.io/crates/random) (0.9.2 => 0.10.0) 132 | - [raven](https://crates.io/crates/raven) (0.2.0 => 0.2.1) 133 | - [redis](https://crates.io/crates/redis) (0.5.2 => 0.5.3) 134 | - [regex](https://crates.io/crates/regex) (0.1.55 => 0.1.71) 135 | - [requests](https://crates.io/crates/requests) (0.0.4 => 0.0.10) 136 | - [robotparser](https://crates.io/crates/robotparser) (0.4.1 => 0.4.4) 137 | - [rocksdb](https://crates.io/crates/rocksdb) (0.3.0 => 0.3.5) 138 | - [rotor-http](https://crates.io/crates/rotor-http) (0.6.0 => 0.7.0) 139 | - [router](https://crates.io/crates/router) (0.1.0 => 0.1.1) 140 | - [rs-es](https://crates.io/crates/rs-es) (0.2.5 => 0.3.4) 141 | - [rusoto](https://crates.io/crates/rusoto) (0.12.1 => 0.13.1) 142 | - [rusqlite](https://crates.io/crates/rusqlite) (0.6.0 => 0.7.2) 143 | - [rust-crypto](https://crates.io/crates/rust-crypto) (0.2.34 => 0.2.36) 144 | - [rustc-serialize](https://crates.io/crates/rustc-serialize) (0.3.18 => 0.3.19) 145 | - [rustful](https://crates.io/crates/rustful) (0.7.0 => 0.8.0) 146 | - [schemamama](https://crates.io/crates/schemamama) (0.0.11 => 0.1.0) 147 | - [serde](https://crates.io/crates/serde) (0.7.0 => 0.7.5) 148 | - [staticfile](https://crates.io/crates/staticfile) (0.1.0 => 0.2.0) 149 | - [tar](https://crates.io/crates/tar) (0.4.4 => 0.4.5) 150 | - [telegram-bot](https://crates.io/crates/telegram-bot) (0.4.1 => 0.4.2) 151 | - [tempfile](https://crates.io/crates/tempfile) (2.1.1 => 2.1.3) 152 | - [time](https://crates.io/crates/time) (0.1.34 => 0.1.35) 153 | - [url](https://crates.io/crates/url) (0.5.7 => 1.1.0) 154 | - [urlencoded](https://crates.io/crates/urlencoded) (0.2.1 => 0.3.0) 155 | - [uuid](https://crates.io/crates/uuid) (0.1.18 => 0.2.2) 156 | - [vkrs](https://crates.io/crates/vkrs) (0.6.1 => 0.6.2) 157 | - [websocket](https://crates.io/crates/websocket) (0.15.1 => 0.17.1) 158 | - [ws](https://crates.io/crates/ws) (0.4.5 => 0.4.7) 159 | - [yup-oauth2](https://crates.io/crates/yup-oauth2) (0.5.5 => 0.6.1) 160 | - [zip](https://crates.io/crates/zip) (0.1.16 => 0.1.17) 161 | 162 | Anything we missed? [Let us know](https://github.com/bashyHQ/arewewebyet/issues/new)! 163 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public 379 | licenses. Notwithstanding, Creative Commons may elect to apply one of 380 | its public licenses to material it publishes and in those instances 381 | will be considered the “Licensor.” The text of the Creative Commons 382 | public licenses is dedicated to the public domain under the CC0 Public 383 | Domain Dedication. Except for the limited purpose of indicating that 384 | material is shared under a Creative Commons public license or as 385 | otherwise permitted by the Creative Commons policies published at 386 | creativecommons.org/policies, Creative Commons does not authorize the 387 | use of the trademark "Creative Commons" or any other trademark or logo 388 | of Creative Commons without its prior written consent including, 389 | without limitation, in connection with any unauthorized modifications 390 | to any of its public licenses or any other arrangements, 391 | understandings, or agreements concerning use of licensed material. For 392 | the avoidance of doubt, this paragraph does not form part of the 393 | public licenses. 394 | 395 | Creative Commons may be contacted at creativecommons.org. 396 | --------------------------------------------------------------------------------