From 919977397b4d2eaca6da1d805abc03fadaefb82f Mon Sep 17 00:00:00 2001 From: realaravinth Date: Wed, 30 Jun 2021 17:21:19 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=2046098?= =?UTF-8?q?ec85b289391127eb456105482bd749a85f8=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- COPYRIGHT.txt | 15 +- FiraSans-Medium.woff2 | Bin 0 -> 132780 bytes FiraSans-Regular.woff2 | Bin 0 -> 129188 bytes SourceCodePro-It.ttf.woff | Bin 0 -> 58444 bytes SourceCodePro-Regular.ttf.woff | Bin 0 -> 68152 bytes SourceCodePro-Regular.woff | Bin 55472 -> 0 bytes SourceCodePro-Semibold.ttf.woff | Bin 0 -> 68080 bytes SourceCodePro-Semibold.woff | Bin 55360 -> 0 bytes SourceSerif4-Bold.ttf.woff | Bin 0 -> 110552 bytes SourceSerif4-It.ttf.woff | Bin 0 -> 78108 bytes ...fPro-LICENSE.md => SourceSerif4-LICENSE.md | 2 +- SourceSerif4-Regular.ttf.woff | Bin 0 -> 103604 bytes SourceSerifPro-Bold.ttf.woff | Bin 93248 -> 0 bytes SourceSerifPro-It.ttf.woff | Bin 36200 -> 0 bytes SourceSerifPro-Regular.ttf.woff | Bin 88596 -> 0 bytes ayu.css | 2 +- crates.js | 1 + dark.css | 2 +- implementors/actix_service/trait.Service.js | 2 +- .../transform/trait.Transform.js | 2 +- .../response_error}/trait.ResponseError.js | 0 implementors/core/clone/trait.Clone.js | 2 +- implementors/core/cmp/trait.PartialEq.js | 2 +- implementors/core/convert/trait.From.js | 2 +- implementors/core/fmt/trait.Debug.js | 2 +- implementors/core/fmt/trait.Display.js | 2 +- implementors/core/marker/trait.Freeze.js | 2 +- implementors/core/marker/trait.Send.js | 2 +- implementors/core/marker/trait.Sync.js | 2 +- implementors/core/marker/trait.Unpin.js | 2 +- implementors/sailfish/private/trait.Sealed.js | 2 +- implementors/sailfish/trait.TemplateOnce.js | 2 +- implementors/std/error/trait.Error.js | 2 +- implementors/std/panic/trait.RefUnwindSafe.js | 2 +- implementors/std/panic/trait.UnwindSafe.js | 2 +- light.css | 2 +- main.js | 6 +- mcaptcha/all.html | 10 +- mcaptcha/api/index.html | 10 +- .../api/v1/account/delete/fn.services.html | 8 +- mcaptcha/api/v1/account/delete/index.html | 10 +- .../account/delete/struct.delete_account.html | 160 +- .../api/v1/account/email/fn.services.html | 8 +- mcaptcha/api/v1/account/email/index.html | 10 +- .../api/v1/account/email/struct.Email.html | 178 +- .../v1/account/email/struct.email_exists.html | 160 +- .../v1/account/email/struct.set_email.html | 162 +- mcaptcha/api/v1/account/fn.services.html | 8 +- mcaptcha/api/v1/account/index.html | 12 +- mcaptcha/api/v1/account/routes/index.html | 10 +- .../api/v1/account/routes/struct.Account.html | 162 +- .../api/v1/account/secret/fn.services.html | 8 +- mcaptcha/api/v1/account/secret/index.html | 10 +- .../api/v1/account/secret/struct.Secret.html | 178 +- .../v1/account/secret/struct.get_secret.html | 160 +- .../secret/struct.update_user_secret.html | 160 +- .../account/struct.AccountCheckPayload.html | 178 +- .../v1/account/struct.AccountCheckResp.html | 178 +- .../api/v1/account/username/fn.services.html | 8 +- mcaptcha/api/v1/account/username/index.html | 10 +- .../username/struct.username_exists.html | 160 +- mcaptcha/api/v1/auth/fn.services.html | 8 +- mcaptcha/api/v1/auth/index.html | 10 +- mcaptcha/api/v1/auth/routes/index.html | 10 +- mcaptcha/api/v1/auth/routes/struct.Auth.html | 162 +- .../api/v1/auth/runners/fn.login_runner.html | 10 +- .../v1/auth/runners/fn.register_runner.html | 8 +- mcaptcha/api/v1/auth/runners/index.html | 10 +- .../api/v1/auth/runners/struct.Login.html | 178 +- .../api/v1/auth/runners/struct.Password.html | 178 +- .../api/v1/auth/runners/struct.Register.html | 178 +- mcaptcha/api/v1/auth/struct.login.html | 160 +- mcaptcha/api/v1/auth/struct.register.html | 160 +- mcaptcha/api/v1/auth/struct.signout.html | 160 +- mcaptcha/api/v1/fn.services.html | 8 +- mcaptcha/api/v1/index.html | 12 +- .../captcha/fn.add_mcaptcha_util.html | 8 +- .../api/v1/mcaptcha/captcha/fn.services.html | 8 +- .../captcha/fn.update_token_helper.html | 8 +- mcaptcha/api/v1/mcaptcha/captcha/index.html | 10 +- .../api/v1/mcaptcha/captcha/routes/index.html | 10 +- .../captcha/routes/struct.MCaptcha.html | 162 +- .../captcha/struct.MCaptchaDetails.html | 178 +- .../mcaptcha/captcha/struct.MCaptchaID.html | 178 +- .../captcha/struct.delete_mcaptcha.html | 160 +- .../v1/mcaptcha/captcha/struct.get_token.html | 160 +- .../mcaptcha/captcha/struct.update_token.html | 160 +- .../api/v1/mcaptcha/duration/fn.services.html | 8 +- mcaptcha/api/v1/mcaptcha/duration/index.html | 10 +- .../v1/mcaptcha/duration/routes/index.html | 10 +- .../duration/routes/struct.Duration.html | 162 +- .../mcaptcha/duration/struct.GetDuration.html | 166 +- .../duration/struct.GetDurationResp.html | 166 +- .../duration/struct.UpdateDuration.html | 166 +- .../duration/struct.get_duration.html | 160 +- .../duration/struct.update_duration.html | 160 +- mcaptcha/api/v1/mcaptcha/fn.get_random.html | 8 +- mcaptcha/api/v1/mcaptcha/fn.services.html | 8 +- mcaptcha/api/v1/mcaptcha/index.html | 10 +- .../mcaptcha/levels/fn.get_levels_util.html | 8 +- .../api/v1/mcaptcha/levels/fn.services.html | 8 +- mcaptcha/api/v1/mcaptcha/levels/index.html | 10 +- .../api/v1/mcaptcha/levels/routes/index.html | 10 +- .../mcaptcha/levels/routes/struct.Levels.html | 162 +- .../v1/mcaptcha/levels/struct.AddLevels.html | 166 +- .../v1/mcaptcha/levels/struct.I32Levels.html | 178 +- .../api/v1/mcaptcha/levels/struct.Levels.html | 180 +- .../mcaptcha/levels/struct.UpdateLevels.html | 166 +- .../v1/mcaptcha/levels/struct.add_levels.html | 160 +- .../mcaptcha/levels/struct.delete_levels.html | 160 +- .../v1/mcaptcha/levels/struct.get_levels.html | 160 +- .../mcaptcha/levels/struct.update_levels.html | 160 +- .../meta/enum.BuildDetailsBuilderError.html | 181 +- .../api/v1/meta/enum.HealthBuilderError.html | 181 +- mcaptcha/api/v1/meta/fn.services.html | 8 +- mcaptcha/api/v1/meta/index.html | 10 +- mcaptcha/api/v1/meta/routes/index.html | 10 +- mcaptcha/api/v1/meta/routes/struct.Meta.html | 162 +- mcaptcha/api/v1/meta/struct.BuildDetails.html | 178 +- .../v1/meta/struct.BuildDetailsBuilder.html | 176 +- mcaptcha/api/v1/meta/struct.Health.html | 178 +- .../api/v1/meta/struct.HealthBuilder.html | 176 +- .../api/v1/meta/struct.build_details.html | 162 +- mcaptcha/api/v1/meta/struct.health.html | 162 +- mcaptcha/api/v1/notifications/add/index.html | 10 +- .../add/struct.AddNotification.html | 166 +- .../add/struct.add_notification.html | 162 +- .../api/v1/notifications/fn.services.html | 8 +- mcaptcha/api/v1/notifications/get/index.html | 10 +- .../get/struct.Notification.html | 174 +- .../get/struct.NotificationResp.html | 168 +- .../get/struct.get_notification.html | 162 +- mcaptcha/api/v1/notifications/index.html | 10 +- .../api/v1/notifications/mark_read/index.html | 10 +- .../mark_read/struct.MarkReadReq.html | 166 +- .../mark_read/struct.NotificationResp.html | 166 +- .../mark_read/struct.mark_read.html | 162 +- .../api/v1/notifications/routes/index.html | 10 +- .../routes/struct.Notifications.html | 162 +- mcaptcha/api/v1/pow/fn.services.html | 8 +- .../v1/pow/get_config/fn.init_mcaptcha.html | 10 +- mcaptcha/api/v1/pow/get_config/index.html | 10 +- .../get_config/struct.GetConfigPayload.html | 178 +- .../v1/pow/get_config/struct.get_config.html | 162 +- mcaptcha/api/v1/pow/index.html | 12 +- mcaptcha/api/v1/pow/routes/index.html | 10 +- mcaptcha/api/v1/pow/routes/struct.PoW.html | 162 +- mcaptcha/api/v1/pow/verify_pow/index.html | 10 +- .../verify_pow/struct.ValidationToken.html | 178 +- .../v1/pow/verify_pow/struct.verify_pow.html | 162 +- mcaptcha/api/v1/pow/verify_token/index.html | 10 +- .../struct.CaptchaValidateResp.html | 178 +- .../struct.validate_captcha_token.html | 162 +- mcaptcha/api/v1/routes/constant.ROUTES.html | 8 +- mcaptcha/api/v1/routes/index.html | 10 +- mcaptcha/api/v1/routes/struct.Routes.html | 178 +- mcaptcha/constant.CACHE_AGE.html | 8 +- mcaptcha/constant.DOCS.html | 8 +- mcaptcha/constant.PAGES.html | 8 +- mcaptcha/constant.V1_API_ROUTES.html | 8 +- mcaptcha/constant.WIDGET_ROUTES.html | 8 +- mcaptcha/data/enum.SystemGroup.html | 172 +- mcaptcha/data/index.html | 14 +- mcaptcha/data/struct.Data.html | 168 +- mcaptcha/data/type.Mailer.html | 10 +- mcaptcha/docs/constant.DOCS.html | 8 +- mcaptcha/docs/fn.dist.html | 8 +- mcaptcha/docs/fn.handle_embedded_file.html | 8 +- mcaptcha/docs/fn.index.html | 8 +- mcaptcha/docs/fn.services.html | 8 +- mcaptcha/docs/fn.spec.html | 8 +- mcaptcha/docs/index.html | 10 +- mcaptcha/docs/routes/index.html | 10 +- mcaptcha/docs/routes/struct.Docs.html | 162 +- mcaptcha/docs/struct.Asset.html | 164 +- mcaptcha/email/index.html | 7 + mcaptcha/email/sidebar-items.js | 1 + .../email/verification/constant.PAGE.html | 5 + .../email/verification/fn.verification.html | 5 + mcaptcha/email/verification/index.html | 9 + mcaptcha/email/verification/sidebar-items.js | 1 + .../email/verification/struct.IndexPage.html | 119 ++ mcaptcha/errors/enum.PageError.html | 190 +- mcaptcha/errors/enum.ServiceError.html | 203 ++- mcaptcha/errors/index.html | 12 +- mcaptcha/errors/sidebar-items.js | 2 +- mcaptcha/errors/struct.ErrorToResponse.html | 166 +- mcaptcha/errors/struct.SmtpErrorWrapper.html | 118 ++ mcaptcha/errors/type.PageResult.html | 8 +- mcaptcha/errors/type.ServiceResult.html | 8 +- mcaptcha/fn.get_identity_service.html | 8 +- mcaptcha/fn.get_json_err.html | 8 +- mcaptcha/fn.main.html | 8 +- mcaptcha/index.html | 14 +- mcaptcha/macro.define_resource.html | 22 +- mcaptcha/middleware/auth/index.html | 10 +- .../middleware/auth/struct.CheckLogin.html | 175 +- .../auth/struct.CheckLoginMiddleware.html | 182 +- mcaptcha/middleware/index.html | 10 +- mcaptcha/pages/auth/fn.services.html | 8 +- mcaptcha/pages/auth/index.html | 10 +- mcaptcha/pages/auth/login/constant.PAGE.html | 8 +- mcaptcha/pages/auth/login/index.html | 10 +- mcaptcha/pages/auth/login/struct.INDEX.html | 1594 ++--------------- .../pages/auth/login/struct.IndexPage.html | 176 +- mcaptcha/pages/auth/login/struct.login.html | 160 +- .../pages/auth/register/constant.PAGE.html | 8 +- mcaptcha/pages/auth/register/index.html | 10 +- .../pages/auth/register/struct.INDEX.html | 1594 ++--------------- .../pages/auth/register/struct.IndexPage.html | 176 +- mcaptcha/pages/auth/register/struct.join.html | 160 +- mcaptcha/pages/auth/routes/index.html | 10 +- mcaptcha/pages/auth/routes/struct.Auth.html | 162 +- mcaptcha/pages/constant.NAME.html | 8 +- mcaptcha/pages/errors/constant.PAGE.html | 8 +- mcaptcha/pages/errors/fn.error.html | 8 +- mcaptcha/pages/errors/fn.services.html | 8 +- mcaptcha/pages/errors/index.html | 10 +- mcaptcha/pages/errors/routes/index.html | 10 +- .../pages/errors/routes/struct.Errors.html | 162 +- mcaptcha/pages/errors/struct.ErrorPage.html | 176 +- .../struct.INTERNAL_SERVER_ERROR_BODY.html | 1594 ++--------------- .../errors/struct.UNKNOWN_ERROR_BODY.html | 1594 ++--------------- mcaptcha/pages/fn.services.html | 8 +- mcaptcha/pages/index.html | 10 +- mcaptcha/pages/panel/constant.PAGE.html | 8 +- mcaptcha/pages/panel/fn.services.html | 8 +- mcaptcha/pages/panel/index.html | 10 +- mcaptcha/pages/panel/routes/index.html | 10 +- mcaptcha/pages/panel/routes/struct.Panel.html | 164 +- .../panel/sitekey/add/constant.PAGE.html | 8 +- mcaptcha/pages/panel/sitekey/add/index.html | 10 +- .../pages/panel/sitekey/add/struct.INDEX.html | 1594 ++--------------- .../panel/sitekey/add/struct.IndexPage.html | 178 +- .../panel/sitekey/add/struct.add_sitekey.html | 160 +- mcaptcha/pages/panel/sitekey/fn.services.html | 8 +- mcaptcha/pages/panel/sitekey/index.html | 10 +- .../panel/sitekey/list/constant.PAGE.html | 8 +- .../sitekey/list/fn.get_list_sitekeys.html | 10 +- mcaptcha/pages/panel/sitekey/list/index.html | 10 +- .../panel/sitekey/list/struct.IndexPage.html | 178 +- .../sitekey/list/struct.list_sitekeys.html | 162 +- .../panel/sitekey/list/type.SiteKeys.html | 8 +- .../pages/panel/sitekey/routes/index.html | 10 +- .../panel/sitekey/routes/struct.Sitekey.html | 162 +- .../panel/sitekey/view/constant.PAGE.html | 8 +- mcaptcha/pages/panel/sitekey/view/index.html | 10 +- .../panel/sitekey/view/struct.IndexPage.html | 178 +- .../panel/sitekey/view/struct.Level.html | 172 +- .../sitekey/view/struct.McaptchaConfig.html | 172 +- .../sitekey/view/struct.view_sitekey.html | 162 +- mcaptcha/pages/panel/struct.IndexPage.html | 178 +- mcaptcha/pages/panel/struct.panel.html | 160 +- mcaptcha/pages/routes/constant.ROUTES.html | 8 +- mcaptcha/pages/routes/index.html | 10 +- mcaptcha/pages/routes/struct.Routes.html | 168 +- mcaptcha/routes/enum.Methods.html | 162 +- mcaptcha/routes/index.html | 10 +- mcaptcha/settings/fn.check_url.html | 8 +- mcaptcha/settings/fn.set_database_url.html | 8 +- .../settings/fn.set_from_database_url.html | 8 +- mcaptcha/settings/index.html | 10 +- mcaptcha/settings/struct.Captcha.html | 176 +- mcaptcha/settings/struct.Database.html | 176 +- mcaptcha/settings/struct.DatabaseBuilder.html | 176 +- mcaptcha/settings/struct.Redis.html | 176 +- mcaptcha/settings/struct.Server.html | 176 +- mcaptcha/settings/struct.Settings.html | 186 +- mcaptcha/settings/struct.Smtp.html | 178 +- mcaptcha/sidebar-items.js | 2 +- mcaptcha/static.GIT_COMMIT_HASH.html | 8 +- mcaptcha/static.OPEN_API_DOC.html | 8 +- mcaptcha/static.PKG_DESCRIPTION.html | 8 +- mcaptcha/static.PKG_HOMEPAGE.html | 8 +- mcaptcha/static.PKG_NAME.html | 8 +- mcaptcha/static.VERSION.html | 8 +- mcaptcha/static_assets/filemap/index.html | 10 +- .../static_assets/filemap/struct.FileMap.html | 162 +- mcaptcha/static_assets/fn.services.html | 8 +- mcaptcha/static_assets/index.html | 12 +- .../static_files/fn.handle_assets.html | 8 +- .../static_files/fn.handle_favicons.html | 8 +- .../static_assets/static_files/index.html | 10 +- .../static_files/struct.Asset.html | 164 +- .../static_files/struct.Favicons.html | 164 +- .../static_files/struct.favicons.html | 160 +- .../static_files/struct.static_files.html | 160 +- mcaptcha/stats/fetch/index.html | 10 +- mcaptcha/stats/fetch/struct.Stats.html | 184 +- mcaptcha/stats/index.html | 10 +- mcaptcha/stats/record/fn.record_confirm.html | 10 +- mcaptcha/stats/record/fn.record_fetch.html | 10 +- mcaptcha/stats/record/fn.record_solve.html | 10 +- mcaptcha/stats/record/index.html | 10 +- mcaptcha/struct.CSS.html | 1418 +-------------- mcaptcha/struct.CheckLogin.html | 175 +- mcaptcha/struct.Data.html | 168 +- mcaptcha/struct.FILES.html | 166 +- mcaptcha/struct.JS.html | 1418 +-------------- mcaptcha/struct.MOBILE_CSS.html | 1418 +-------------- mcaptcha/struct.SETTINGS.html | 166 +- mcaptcha/struct.SOURCE_FILES_OF_INSTANCE.html | 1594 ++--------------- mcaptcha/struct.Settings.html | 186 +- mcaptcha/struct.VERIFICATIN_WIDGET_CSS.html | 1418 +-------------- mcaptcha/struct.VERIFICATIN_WIDGET_JS.html | 1418 +-------------- mcaptcha/type.AppData.html | 8 +- mcaptcha/widget/constant.PAGE.html | 8 +- mcaptcha/widget/constant.WIDGET_ROUTES.html | 8 +- mcaptcha/widget/fn.handle_widget_assets.html | 8 +- mcaptcha/widget/fn.services.html | 8 +- mcaptcha/widget/index.html | 10 +- mcaptcha/widget/routes/index.html | 10 +- mcaptcha/widget/routes/struct.Widget.html | 162 +- mcaptcha/widget/struct.INDEX_PAGE.html | 1594 ++--------------- mcaptcha/widget/struct.IndexPage.html | 174 +- mcaptcha/widget/struct.WidgetAssets.html | 164 +- mcaptcha/widget/struct.show_widget.html | 162 +- mcaptcha/widget/struct.widget_assets.html | 160 +- noscript.css | 2 +- rustdoc.css | 2 +- search-index.js | 6 +- search.js | 1 + settings.html | 11 +- sidebar-items.js | 1 + source-files.js | 2 +- src/mcaptcha/api/mod.rs.html | 10 +- src/mcaptcha/api/v1/account/delete.rs.html | 42 +- src/mcaptcha/api/v1/account/email.rs.html | 44 +- src/mcaptcha/api/v1/account/mod.rs.html | 24 +- src/mcaptcha/api/v1/account/secret.rs.html | 40 +- src/mcaptcha/api/v1/account/username.rs.html | 24 +- src/mcaptcha/api/v1/auth.rs.html | 88 +- src/mcaptcha/api/v1/mcaptcha/captcha.rs.html | 118 +- src/mcaptcha/api/v1/mcaptcha/duration.rs.html | 82 +- src/mcaptcha/api/v1/mcaptcha/levels.rs.html | 134 +- src/mcaptcha/api/v1/mcaptcha/mod.rs.html | 26 +- src/mcaptcha/api/v1/meta.rs.html | 72 +- src/mcaptcha/api/v1/mod.rs.html | 26 +- src/mcaptcha/api/v1/notifications/add.rs.html | 44 +- src/mcaptcha/api/v1/notifications/get.rs.html | 82 +- .../api/v1/notifications/mark_read.rs.html | 78 +- src/mcaptcha/api/v1/notifications/mod.rs.html | 18 +- src/mcaptcha/api/v1/pow/get_config.rs.html | 86 +- src/mcaptcha/api/v1/pow/mod.rs.html | 38 +- src/mcaptcha/api/v1/pow/verify_pow.rs.html | 68 +- src/mcaptcha/api/v1/pow/verify_token.rs.html | 90 +- src/mcaptcha/api/v1/routes.rs.html | 44 +- src/mcaptcha/data.rs.html | 128 +- src/mcaptcha/docs.rs.html | 92 +- src/mcaptcha/email/mod.rs.html | 43 + src/mcaptcha/email/verification.rs.html | 231 +++ src/mcaptcha/errors.rs.html | 214 ++- src/mcaptcha/main.rs.html | 124 +- src/mcaptcha/middleware/auth.rs.html | 284 +-- src/mcaptcha/middleware/mod.rs.html | 10 +- src/mcaptcha/pages/auth/login.rs.html | 24 +- src/mcaptcha/pages/auth/mod.rs.html | 16 +- src/mcaptcha/pages/auth/register.rs.html | 22 +- src/mcaptcha/pages/errors.rs.html | 60 +- src/mcaptcha/pages/mod.rs.html | 72 +- src/mcaptcha/pages/panel/mod.rs.html | 34 +- src/mcaptcha/pages/panel/sitekey/add.rs.html | 22 +- src/mcaptcha/pages/panel/sitekey/list.rs.html | 58 +- src/mcaptcha/pages/panel/sitekey/mod.rs.html | 18 +- src/mcaptcha/pages/panel/sitekey/view.rs.html | 76 +- src/mcaptcha/pages/routes.rs.html | 24 +- src/mcaptcha/routes.rs.html | 40 +- src/mcaptcha/settings.rs.html | 64 +- src/mcaptcha/static_assets/filemap.rs.html | 24 +- src/mcaptcha/static_assets/mod.rs.html | 18 +- .../static_assets/static_files.rs.html | 120 +- src/mcaptcha/stats/fetch.rs.html | 60 +- src/mcaptcha/stats/mod.rs.html | 10 +- src/mcaptcha/stats/record.rs.html | 18 +- src/mcaptcha/widget/mod.rs.html | 72 +- src/tests_migrate/data.rs.html | 128 +- src/tests_migrate/settings.rs.html | 64 +- src/tests_migrate/tests-migrate.rs.html | 66 +- storage.js | 2 +- tests_migrate/all.html | 10 +- tests_migrate/data/enum.SystemGroup.html | 172 +- tests_migrate/data/index.html | 14 +- tests_migrate/data/struct.Data.html | 168 +- tests_migrate/data/type.Mailer.html | 10 +- tests_migrate/fn.build.html | 8 +- tests_migrate/fn.cache_bust.html | 8 +- tests_migrate/fn.main.html | 8 +- tests_migrate/index.html | 10 +- tests_migrate/settings/fn.check_url.html | 8 +- .../settings/fn.set_database_url.html | 8 +- .../settings/fn.set_from_database_url.html | 8 +- tests_migrate/settings/index.html | 10 +- tests_migrate/settings/struct.Captcha.html | 176 +- tests_migrate/settings/struct.Database.html | 176 +- .../settings/struct.DatabaseBuilder.html | 176 +- tests_migrate/settings/struct.Redis.html | 176 +- tests_migrate/settings/struct.Server.html | 176 +- tests_migrate/settings/struct.Settings.html | 186 +- tests_migrate/settings/struct.Smtp.html | 178 +- tests_migrate/struct.Data.html | 168 +- tests_migrate/struct.SETTINGS.html | 166 +- tests_migrate/struct.Settings.html | 186 +- theme.js | 1 - 403 files changed, 14815 insertions(+), 30731 deletions(-) create mode 100644 FiraSans-Medium.woff2 create mode 100644 FiraSans-Regular.woff2 create mode 100644 SourceCodePro-It.ttf.woff create mode 100644 SourceCodePro-Regular.ttf.woff delete mode 100644 SourceCodePro-Regular.woff create mode 100644 SourceCodePro-Semibold.ttf.woff delete mode 100644 SourceCodePro-Semibold.woff create mode 100644 SourceSerif4-Bold.ttf.woff create mode 100644 SourceSerif4-It.ttf.woff rename SourceSerifPro-LICENSE.md => SourceSerif4-LICENSE.md (98%) create mode 100644 SourceSerif4-Regular.ttf.woff delete mode 100644 SourceSerifPro-Bold.ttf.woff delete mode 100644 SourceSerifPro-It.ttf.woff delete mode 100644 SourceSerifPro-Regular.ttf.woff create mode 100644 crates.js rename implementors/{actix_http/error => actix_web/error/response_error}/trait.ResponseError.js (100%) create mode 100644 mcaptcha/email/index.html create mode 100644 mcaptcha/email/sidebar-items.js create mode 100644 mcaptcha/email/verification/constant.PAGE.html create mode 100644 mcaptcha/email/verification/fn.verification.html create mode 100644 mcaptcha/email/verification/index.html create mode 100644 mcaptcha/email/verification/sidebar-items.js create mode 100644 mcaptcha/email/verification/struct.IndexPage.html create mode 100644 mcaptcha/errors/struct.SmtpErrorWrapper.html create mode 100644 search.js create mode 100644 sidebar-items.js create mode 100644 src/mcaptcha/email/mod.rs.html create mode 100644 src/mcaptcha/email/verification.rs.html delete mode 100644 theme.js diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index af77776c..16d79032 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -23,7 +23,8 @@ included, and carry their own copyright notices and license terms: Copyright (c) Nicolas Gallagher and Jonathan Neal. Licensed under the MIT license (see LICENSE-MIT.txt). -* Source Code Pro (SourceCodePro-Regular.woff, SourceCodePro-Semibold.woff): +* Source Code Pro (SourceCodePro-Regular.ttf.woff, + SourceCodePro-Semibold.ttf.woff, SourceCodePro-It.ttf.woff): Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark @@ -32,14 +33,14 @@ included, and carry their own copyright notices and license terms: Licensed under the SIL Open Font License, Version 1.1. See SourceCodePro-LICENSE.txt. -* Source Serif Pro (SourceSerifPro-Regular.ttf.woff, - SourceSerifPro-Bold.ttf.woff, SourceSerifPro-It.ttf.woff): +* Source Serif 4 (SourceSerif4-Regular.ttf.woff, SourceSerif4-Bold.ttf.woff, + SourceSerif4-It.ttf.woff): - Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with - Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of - Adobe Systems Incorporated in the United States and/or other countries. + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. Licensed under the SIL Open Font License, Version 1.1. - See SourceSerifPro-LICENSE.txt. + See SourceSerif4-LICENSE.md. This copyright file is intended to be distributed with rustdoc output. diff --git a/FiraSans-Medium.woff2 b/FiraSans-Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7a1e5fc548ef28137a32150b6aa50a568cd53d02 GIT binary patch literal 132780 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�|o|A<_G9#bJ&K$mXTSM@kZfZ^-ZYS)6EG~kHJ{! z(kRY3IK1DAx+i!~-GutTX%UU&{*cBJ60OyuDMC-6c|BUX_5xbdibLNw!xz$XgeJ82 zN%Cl?y$c=cSf_${vuqI@GPZbZRsaEZIN*G!$s-1QE(HoDVGrPgUjxwKMEHad!iXSR zi9LE8;*gJ`JLE=B!ginT9`>n66sM%WB2W<|m=Ei@&UYzk)C8`tBD2&vdNkH_nABd6 zp)as+PT5g-cg+r1KKwc>U&kG9{{3BxHQ$A`F|4Z~q{*@!e-k#kCfAIAbb<9l>LLA*WaIQX z(oh0`-~$4jxea3BsX;BG4*2<&4i%+&-=S7EIaD9&J!)LCSYsA7)^WGvdD3y{K77LG z5q^XaK@5pnDu6TVd8;L$!Zm83Rp>;yZ{&E`Bllk&VuxepDdl;7?Go!Su#B3`3M{as z1tYU_g_AWgN87V0!d>|}WSEJAHR{QQed-4VOwa<`^}{T}LU5@xnNSc}oUm?rBTJyB z*bHXh>98XMJ~exxaM5Gfx5^O9?rM@o{a8;K(-d7vDU3Ofak}*21x$U12firwcZpwM zg^hKwn&mB&ct*7n=#4tlBB81iohxYGQz{W-^zMbdcPU^x2omZ(+Q~cosYg_KRL3YL z7N_O3@I>$Ih6Ovm$nIHAnGuRXSZY?i2+x4GH=}oJJ#=BEDB_%?bRjobG)4a}85@2V zPYtJ&-{o3$AZ>Zzchlw!?G5W^vnZ%ttr6A_xIRK*;&I=!UbB{Vf14S9FIt$%2ApJ1 zV_Wh#Tq478`cre1VP{3c8F2q+q{V?7z!6MvFyed)(CvSdx$z?$!BH8e2LBkYIDc?r z#Gg|212qz6SmDT`YHl&!y|`aPSdF+fHj(}d#PIJzk;p=ks%7TTJdrS^gjWvXtgOx^ zy!Mgkk1VGXynz-v(*F_fQy5k`;^T@WbhtdHNAUULaP2h91OHy}^e2u?xwMPpvs-ED zvy_o#ldYVW4`Q;nBgvSLak@>$w#tPOxR3UHr?emz2nAx|>n&MUg-z}k4=&ZDj;XXXGvs@K zVOjqDRswmnfK2lkv!Yvlnp6|Sb^fq))??vW#`|_xTlL%T|$K-wt6Vo(}9S`>f5;xSFiVdrttr8Nhq5$1mtb_TeGG1-jPv*YXp}sjU-v z$6yO=%$0;Z6bEshhGAVgI+1-o-5FH-`)h-vza4GIBj%b{m}{bqG0mFV+d+0TUGBhB zPjJvK^K99fIrUQ7uH>-r^AlF(@+!skuuNdrr?=iM2va#uk{py~yU8BW4ze3Ap9#)NHdvM; zeh_aaXyV?SgoSoxSlK#X?H8T6Nlo0miCdiy`RLAFrn{v$u3h75)2hwTnp$epSIkgZ z3F;U16T*s)vf{_Y2RWZWytUKN_5`uRh90eNh;Hp>mGqLZOkGPjY`y&=V#n<-ciC#t z+_!lZ9|YlB&9Jt2hTXyb5{r#D4yyyDi_z3uG&r$svbr6|=Rmpxez#9p!I=~s;*b}x zc*@?Y_&zI1S;>i|m_Uh9RNS_elbTmR>vFcjImVvg8i8X?q-0R`H>tUQ>($4StVgi7 zK`8sA+$5AxZgJc;R1a0TZCm<$j@63Z`X-Rnz*?rnM3lefE?ubEoFW0Q< zZEUQ4@uS?_n|hxNgWK&)LyBr*yhHd%<%FYkv+% zZ-CG6W>4KYw0zOx+TvoI;Li~ISw6tIR%h!p0kij1a9kE^R{kM>6}!zw%(@Dg|C}F% z40aC0zsMl3)>sfy_=9R31e7|BQbJVtLms11Xy@`qiX)BX?;``a_!uH4`yX6`n**VN z?}8k^P6=BN>aJl&Df#Cs@{OLa`&7*TNO=Q6Wc-bP*9LNdt3T5aL@B!{1L|J!Xvi~V zFL;8>F+U3C{OFDR5Dko7zb}VJ%;Zqs84}(Ay%ovZ0Ea+$zmNhq1{xAkB07wy6dm-K zGX!e7O8Zf1dPWsQm~TZGCrc7=T{qi$gEv%R=m4-+|5_*5{KwhEW-;0Zmw_LJd7s2& zAiQ6<3e$=WXu>AjJ~N76-c7=G5$W&EIQJ=>AG*X?yO*Ts$d2EDDnHV&5!5%WGVtrH ztp{nJAld&&{xY1#4T65IML9^SEyap6y4)Jh@gh>uAEAchfcZikZ=sQsV z;utI#_!A=7De_8TjL-0e|E@#AvYzrG&z@;=YloK zNrii{e{uDgMPFm#I{4qf7<_%F8?O)x=h@0+l&rfvn&e$$R}g?jApZ9`Go* z4mnDA>FbPUCuI3A;GUq0?0@dKi`WcC{!<&yfuvow-8T&bLGC<({mg)-9#@`nP2#!BgE1T9-`NHhM0yxX_k+=;7i^9eVk23MMPl615 zThiN_lXW|CB#qvgmV@inLLqzgMM)-)-Gu?7c=Q*wpKBp zPA)n~a^N#A8+P?91Zsz5fas@X@gx`7xxLI$y?_}Gvaug(5}Ux}`84DKfr9?Uk@IL2 zT>6UFjDhBtMUF!ea~yEU`L(a+6P0f228OT=GkP{8rHS^K1Xbv*tEYl z;Z+i%rhG;Q6)(@F=M`R<;iDxQx4AU(cn1Lci!r>}K>!3dV+w$%rOZrG2=}1?dhe04 ziF|DsF^L5sM&>?s`z15RE+a;UQH1IJU*ErS#BSX&3UYF2C1CUT1O6bx@Fyhf+w(u^H_~)xxSRk0E%hcNx5{wy4Dt4wzl>v z`^~Q?#z`U0+ACZ88y3*>emp{B@Fu)lq*Ql1O+2C2sklEq%({%!1 zcKA_8xR@+Id3wbZzsZiKKjI{pVFX00vU{*+wa#z7Z&xOFS?Ctk^(-i(TGvzCwWd%t zzv3K5X0KpI+uyVQbo|Lqhau+1_Ey{WMmz1coFh|yd5AQpsinDSx8sg!@4GyBlnq9G zeixBVwSfaQXW!jriHPuS+Sj$`zt1(x3>f|E@Pjf$|4gHKbeSFY20zD!7OG zkp&qtR+2F#^Q&f?_VPnU1^u|A+Z|tTg9eJv)nC)xgYxi~Dh_vNJX#$}NwWz79A5>P zbhcsXq)BTU(ezr!Depoovs}|do8|YmdjLky9oDLd5^#JU4geozREvlAd4z#SXnS;Z zI2!zJaEeUGuoTnr=M(!my^%;JKw$ji!u(@3s~M^Y@E!SGn*9)V!z}6OUYiuV1-lf3 zx8MW#EDqB4H}Dhu7yc-T-1Aag>1v1AY5VDpW)@r~_|7 zGcjK9ns09_Ko5aF68`cYB0e1F2b(%U*MaLz;#( zUHc^L3Gx0?A6=m*^n<~2`A1?LreFrWybp*+``b2pn?pgMvds!&9VAn?7UatT}S$&0na<4q_ky zQXm8Jpad$Qh8foVOX<(KUE6XvNHlsaB#ND}XdN~IGV$7yJw(g7f*(&*8aza-y&W;>@0Pv5VFhhV4pE)$W*<^O#8G8U`@$xq4N(gq#nLi$| zF1}&8vHP^`cPr}nKr+~%2B$LBucHF5MM(xzOM$DqLxCgn_29)hn@lDYc=(-4__FY2 z`n6X+J@s`?AMdkQ2OksqTEhhOp!+@An_LnA&%rArc0GU}k@*k;?jQIPVsw8yYI=k1eieybNE|$2YI=!${ zuDIES8YW(1E-7bNyZs<`$zAMK!0=EMJ^p>^gz!Brx8f=s8|gOmVCq`UfJXY!N%#nT z|B`t4Ntzx7`kB3R9LSjR#vZyEiGx8eY8to%NP-klOAIe^{w%f2)YZLV0fMYI4MuQ4 zewad2*)-QuHT`wcMArv#TVILW`J>Nwg~5i|W{5HN8EJ~cCRpWJQ^>`KHu(4uJA6o^ zu7{37BL9|>8S5$_Ue`+&gW+a3M=lOK-B71}1Lo3IkkQAiP{=Tf#}%Kl2_&deZlOwk zsM>qgjfUnHe&h2M@iN2BIS0_fRB*^sqo&S?jyV$^{;Y&CJF(>)q||dVGOd7xV@15F zD_5v|6)IJ)UTx}{G-z3~PTlJe$a0Sj>F$ZeR(l3Uu8S@Un_zL95~-Wh8G~5dAtK2L zKgUWa<{`ZJJA=}}QFBIxnmam6wvA;eY@hgW?3~ny?4C>lpH5|5_D(z4KYf7%o8AI% zx0ofLw!Bq7Z+#myZfiej-tV$Z`~Gg1jvefft{v}$o}KSMeY-lyRkgM7R&VQ1i2Hq< zF!v|nkh{N|cqrUqsppz|z{NxDzKKld?{Vsp{*0gLkiP|A(vkaC$5H$?ag=T|hkZZi zsNAa@)n_tcbmK?XN@^&bEw&8$vJFg|+s&k{gJAZj$I!>?3iM6MH7uAGteDQXSvk)I zTeZ-IJ7DR{aPYD`w8Qpl&CXrl7TmB!SMu#o%G0@-TZ?`IXrIaobhtAlG( zdxyY2OF($X*NDh2rXse_H-PwVZWQU=NkBG8aH!>E2|HvcIHAM94;KkxlvHG~;v$cq z0Cl1)(I!oWE=^i2=`&%=UJb51_qvj|0Kd^4wGs8C=8v-GhegfXL7+qu&0sW{EmoVu z#ls7z>3y!uuw<%BfYE8iR^3Jd0hjIKKvR3n9DE`pw6X*_b6iI9#>8Yn{#aXs0&%F1 zYQ(V`)sC}us23L+&>*gd7LA}~Q)tz)s&%XV(Wbv0=+Rlb_3gqG0j%HCC9I5;TCr=C zRKXr0Sh80_(zJKl**Pu8TwRlUf?ImfL$~&*thqh!eBF_M0q*W`A?_`#Xb%=soX1Nj z)l;P%fqM}8oXB^Uv2Ehs>~Wx{ zNQqv^WZ5e@m43nEdh^nH_mzeI`+5C;!4C61b;AD5U}_z$+AvGnOvY`~bh4bRn@_fr zLo3N~g6-rqIkS_ThrQ%du%BEfw+@o~1jos<`%k@+w@_b_FVxp$o>r-XvCZR*E~Nhzsm>G>{zL}H0l zX3m^=q$3~YsG$%M37K52E}O8=ueoqBEhH1rIN1j6U)^Gk|Oc$(9m z<2;vt1y^(>SEa72&ge5})(X~t)S;zQUy{2B$^YJu&+RNP>h^Mfd>by7E1aZwQTBuI zE7_3DYnF-=BtHjC&#|;_+h)uBO1@`wP5NG&e?-6? zDsbHSdkf=TDl77!2$v5dk21QL)15$~6O*_kC$)jSNSES=`I)d}3Hb(l%P%B)_ty^Q zXWkwjt!n#m9a6=-qltkhPGO}~7Z2hS<2c1mmvF+=b1J35wtcW})!XFoqY0REdoHFa z>!kK>i2<6k(FAd52|e~yGta&B$m;>;`5;zF{vV;^<4BydbmDlg<>!m(nDQ^SpRdMy zzCF<9FVExuX7*10W>ZUc%TCnImd}AYddC~<00e;{(OBY9#2|;Vxjep5B$n8(sk9#{ zY~6Z$oDPB)30rphX4s6LUQ5q|b?DT^uU}J3TUXz}(8$Ep%>4LeIxzHzWfmA5;n-xv zLCHEPPl;>fhwQ<-cH|yDn5aE-SQRS@%}%l8 z$03d)D2kF>Q;c#1D1RMG1uBw-O4MShqplppYssNCy(>f;Z8@~lo}vS743VG{(?W1+ zX@=5l##LH*Xokt$_sEHf{DqE)h#-49avJ1d zE^4^u;IA?WdjSzS<>?V0=@CO!Gdr-goPtrfr96`skx4>6Nhv5RRi%)cJN|fY%68V$ zwkcsx!m$>zII*=W94xvaQL601atSKQiz?NXjJ`={4MC%poX$z2i=Exp8fxEE?>gne zNzV91G@)0QV)yrDR>3M*p>@bgrr)GHw%odt>g}ZZoejlyQQJ?E?v-eNst+V*D$#Tb z9Zi|fQsmfLF9HOBtpWf50001hJLxeJ*<83#<|2!i!DOo}YOrC?mbvDp5OX^mb0@61 z7rwb4A@hJcA6jJ=hsb1hH#lbpSn~oqk5Qfo#{5T`CIrm?!MIGAT;&GH>=G5MYdVqc z&yj%ZSrC^5i$419=$((_zQ3!jZ{WKPcFVQiBAe^8vSLDm0ssJ81sG%{dj!GR4agob zy8)SGi)2&ly3)&(Cf8$d$W2TWM{t(t>J&+^p*?1-Bj~IP2N-S`-Sp6mq^qB;2?# z64bj53w#gwK@A;)TbKgU*4f37dX~|>*VS-vpp)>Dgod;@j4oAZ23BUs(5m0VJ(QMx z5Bj0UL;rp1Ip~34kXJ=MA}T@W?X_YoV&z$|Lxt!Y*f(|w;<1p{dzoS8uEmnHf@uxw z_BpaUJYyxG`LGZsXp`T9N+r50NSi}w{7r8W+q#sI-oJ)TB>Z3R8v-K})sw~ZG>86~PeP7{K~P+`o3PgpS#$viC+8(H$boyX7Mfk|k7n25n7)yv%f_%O9}odzgY z4CuEeO-2wS23n?0lhwpS124yfLB!oDvRvnRIPI9QAz|WyA+FBtLeMHB2LI-6+MOYGT2t)5{DEJ{vQ4 zx8*K9Q+;)FZPDbbGDCNMQBYx9G_creNyZ=h_4%UA7jrkUYAUOh)h&bdXdA@WM%W~- znkOz=Ym>DXXC130(|440BlU~#J(2asg6V_(V$}@51>)z>#KppTZb!oDXhYc|94$+l zIcczDmbS{%6+tdmVL4qLYR#<05&u0v-x61Ta)Yni65E|77R|0y3uaFfN1tZ8IM5)Q z$~8Y!=+|eZvJ+y}oQ<#NB0C=!7Y0k_Qq0aTz$@TYv23nIcAa6lk>(xo`7Vq1!29Ch z%a}G_Q#3kB@*)ewpG{r7Fv~p^7?LuTtP=mQp;&U>{Guok|5ERqCn->E)tst892-cF zRBsmIAl;u@4?NeSEHN$|H_XjDJ1feeM1^~jjCLPhQOxx$GP{rJ;^suH8It zTT9ZOdV$~5)OT#$NjTa`WY5~O%V)#l8Y{=T5tg8Qagp0CC6~&*r||80{r$Ur^QC=j z-+4p-ZU46`#JewI72tjuV6LAYqXvSE%vgN0av%*Cv*sOX8Xh{3R6 zmxM%7$&-$1p3JJZr#`Cc$%#IT_C>uGeJT26v6jlLD(>WAC*Pogr@lmk5|lDzS1e_y z8WuH}H3D_Q@fzX6uuQ5s#Z|QLX3=r0&&(pB{lq8B{Y4c$$JMHW7qqr}ykq@)ENlPz z=9*eQPA6n0^Vk{SU)|M_xo&H z*Y#X-6#+2 zuR4s!nK&z zJW&G-%@)9+tvw)APPxGHeYjJzM@QC8jM9c5@xn#UjREfl^{Kl-L(mgZxcTQsHokN6 z302d%SHZfLcrihG*t&I=bpYMs8)1dGKL(j$v?v zC`q#I>jqXgCexhtOp)aT_{icL-?i6hI4sdxGTE7sN`TBP^aeeh2{*UlPfBrdT8!o#vPhHQ zZqb|G5%DI@K)8_PN5!Dr3g@ui;9>|%2xMB|mw=~wn$>nsnmUGUAwJEUIYsc5yqF)f z57ZZ&53mD3P(65Fz#IbCRX#(I83M~&IEVw`z;7Tocw4|$sAbk*Y5+D?e%idNLt58P zw7Q^6kHoPow$F;4ImOtqpQ4>oMn5s)84LExhxvBAQ;nITZth0sMkE71K^}2nr^%d* zHh~&Y8-g#9r!L2YdJ3mFUN@PwjNMXK{{v zwxiszj^!V>(*@*N+=3tte650Ofvf?mP|egp)4?6*oXFfd!^)A}Sq{ zICG*z5>IZ~%8(P1_;AEzOnBnJmE^U#GW#tv1O&j~y=@R|cpHLFewX!@jw3JZnqPlkqqgwY{6OUyLz z!-*NT%s632K4*g!i4w_qV1_WVoB`$v@2z8cIRnBpaJGAS1+z$P-y)TXd2@cyI|e(hoxPkUSdk(LnMT+#?_YK{Q8%JP1?k$YYj; zEX^Lx=Q@uE1=Xb0UE+Ej%&A3m&9acvtSux|3#oI&AxmpnL02R6>&d%UM-R_-KK;4* z@OGTO^YUxnUyxZegb6HFRjcBw1}6JvVO0>SMz0R3dC-fPJX=etm7^h?FecqcdiqMKErKMz(vVTW5GceM1#({mA%J5} z+bxF-uAKB2ZKuruZpjOPadGiYnz35bFx8wrbWqdrBI_O$A`BLb#p269`1o_tKg?*s zRM>(osfHn*q4m(2+D@BAm>xMZ45J@>;7EK1Awr5^4nibREh?s2j=rRD_2t6R$-(7= zl*Sbm7)wNIa%rP*XX~kjMJ@XSg@?x&lQvp@utZ5js>mSO!rDr@Jmvd?CN?)Y!c1{e z)M5R(vw!M(lz0U~8ReV`tR$BmLl^G+Z>O^kf?bN4j}SRUpiJb0tIdow$ljw&&J9H* zxojOQe3O^d7!^DpVViLIQKT4~WV_yeWR^%N(~uFSmLkm5zC(P2i&0jFsodTV{xBva zX;F;4A~Z@AUCR#^8RgXQlhz&O8RCxFv%*aXaO*Nr3F6&hMuog{i+9n0#zJACCQChjOsO)(W^NKq6 z45hxA)06d01mqepk)ROzUR*}gFn%&{l-*z@Q{xhQdcXOUmMnj2c(YQC)QKgw1Ucy{ zZ|A`qkAO|wW_}0;0>#bd58_$_Gq6Q4hCp$-!G@XDH}D`}K)Z@2V?qKOpS~MlKc}RW zWp_V~BsofYgT~XWQmfQD9m}!|Whg@#Dj6hA&ib${n{`u8Rt71%@@WhW#c?OsieD}N zREsil$#a!J>hQ_)(&WH>jlcQ7Eb+Gn!8m~+1F!+8bxi=Fms=hn1Z)JBH_ja@W^D|exdhGgi*exv0W zDnW`}^by5Dw~Ngff)KHb6gKWZKQk3k0kQpK<74NpuXYhcROsz)nkhn)W`^F;* z?FR2axTkHgwLkJ__PW-v3?OfGD=`=;Vb-ZqaHCZTwB>)u&pdQ=D0`N)$%n< z!~1V~3>wqYqHyyH&ZxA?kF~<4nv-&Uxjv!`*qST2*Y3`(^Mxy{AJ-CoLal!brFHT_ zvhXN^7J{<0qu*%L_~H&JYu+A_E~U3Metllm_z|VY{JB=c$8?kZD!ruft6O?P0d7EB zvc*YE0}%Jw3u^(iwlqWBtyixCfVTJCoMS<-U>9s{+k?xg)1t<9l_`yl#HC%0nVB1f zGd8(X(z?dXEEbQA9nztko!w_Eb!T97lZ;kvX*#P`G#P#H^RwlQbXRR==PI<)>?0x_ z*{VHEMrD+PM<5Px3X4#|w{Ql%o2wV%U>grU>T$Q&D5ib|+=6T|=DnRN4glDD)LxGy zPYttZ-C#FTiW)W&i;K~kq8ql$E0M@z=Y2@2QA*6#m8h&)hFH|FgT_L99Z?B{;pk6G03d`odI1watTK|sr9Fm4=d})V zoLOQnsVc26>qOlp2cS#lh;jRzo5L$p z_oMEKJD-_ju@E>On?1+owl;(m&v%4}t6uK>t|PqbmE7Tm_r+oQ#^^1?ZC=S5fR$NN zKhOaPAlH>EHT!TPrq?n^W+$-wQ+rUsJOeu(2zh{{a+La8@MV;n_&Kehf)%W&K*cNh zWU|UuO6>Acznc>1=9(#XPh$yA*572QO~^MWmxCw=PR$wc2(;F^j)5a&YQkt;XTUT>n<6BR-jFA2RRU;lcaNI z?zJK+6=3Hux;08kly65?6@+B0(ghK+9R{yqFiEglbs z{e&xX_jm}QEYKPfztfmItbDDkc8A^J^)9c(qqCgO4?BmsuXWRA$}!T?cOmGweu3|No;ChnioEgi zd#Nwg4>SzJsGnB<%3}sFoFfZBr~7xp`)dn}_5@cVE7 z;rr2+;ic7g0)J8GblnheoI7`&=@;j8P6%F*0Fe)hzIf`x!J-JF-&c~2_j8WDJ~VrV z8)I}B>!0Xu^bL^u){ef8XitoadD3I9wq&FXM_IHOg0#$E5b+N8Z!~aOI-Ji}A~tfT znUfn0%Eyks!ETgIo`w>LIz~`~KXGqQ;`m z0(_MfB8!AkM9i*CVE{r~A*}E?fL-}y)H~m(dp9CU-ksnEs;d+EL{rr{c3~5%F z`<7^>skFLwIhf7n86&m}D`eEJ9=jcgFDOHPtkYi6Klh#r9;W6y{SkbWkzC7A%W^g= z9IeoWv7t?&1vyW}Cezu9S7HJUIIuQkK6UjLe8W#4mUb_z|1UxK8M}X8nJ;>6rjfs-j@&hp zvDeW`6CL&Uhh0v%<^j)n$5;NyjT}M0O784SWF0ws-K?v%raBqmPrIFT-GiR@uCM)> z7deB4ivwBT&aRw#+GwV;f&Q|`DK|Xi1@HOBUrFRDGko0co(X3N&j~{W437bSF zzVw4l4mjryk9oyMe(+zx$X8C}goxgw>)_VBLk2X8#ygNPaRUiA&|7MK*A)+Kg z^e8P?6Q60Lr$K(Q#UU5mDtb~xZ`6LGxrW;7W3XRs zchqI~dfJ;l_iKU38n`^io@7JxP%T#rjdal0H-59jF<0E@8E^T*Z#j{zjL*W z{I~c&f2R^sM^rR)3`{KSTs(Z=;H`CqAug?`s;O&WlEq|H4B!U6J!A+JPC-pe&&bTm z!Oh$LN1@C@B4QF!GV)3)Y8qNP-Ftr0S>Mpu)I7_{$yTgkV&f9D(CpwM7egI6re|W~ z=5r+`DSMaxq<@}Qp{}W|i!d-UG0S2K5^B@`@<&}T06=^Y7y^Y;P}9=4@gt!MGb;x- zFTaq8SSOBj%OWKsucV@;p{1jzZ)ki^@pr`>Sx!l|;z%n>f>ascQ1GbOA7Rb6CsGbt zW==k(sx@jCFlf|7udJyrtd3l7o4pP@<)Z8E`_?nRdYAuyfRI|P4q{;w?f=9(B zB&TI=XG4BvBfzIrwMOj%2927q(t2C%>irE>1+{?L;9W^7jV{ITg6W+ve#N>7S>FwW zd?hONR;NWLgkT04PTt3yP?%`gXJTRJ;^7k%78RG2-gD>fT2Wb5T~k{ZVPIrpmc?Z% z`VZ3gto@jZjsXDTgTN3doPv7OZkC>rnU#Z^mtROkOhT$Nzh6<0^GYge8d^Gf`i91) z=Dqxbqa|oS9HgY$z`J_(&0qe*fBtLr|1swlddeb>hd)#9;P8ykX~Y$1SIOF;_Y1pl z#GFQ4gEps0o0Xkej-!YescBluV8@iwu2B6>XE#LwKniu|B?RoJ!w2O6t;qXu3qwsr28ZuRbTdR~5 z@AJc1Tnnvm?aSev!p|=f<3-Y4WVhB0|Bia&zNn6eH(m%_j!Ts!>*AioN}nI1e4@~! zFsLx4u(YsQS@^VYRcIHhaC)K4nA5C5PIEU%Wi{3WmIBI^_!ZP(LB$mlPG?DFNH_5l z&}if~9%tuKvB*#ok#8eo@aSdi+ZR)I>wEkA57Jzdg#r8Y5tVU}odp6ISc|Kb{==&* zX?``p9q$6gh6jSAFjRqiG_(RznNQxA-@x+Nd*)ey`d8WTpL}vM_V3&8x%YWDk$>y- zPR}pi1b;#(yR3hOrq$^UMw1y2UyWKfR7J+v|2tlY#pZB%e1XtcDt(J5T)}t$*oY)D zg-QeI3|}bsxg*F$RNbV_$<_jjex>Xm1em!3KWF>|&u9DsPa{9#4c<2a(trRd$h!!@ z${#wK_eIqOxgHmnz=rClnYnyW>c{Ro7y^YM$P}sy21gMoR62vnVskBv)UdjGLVW`W z4qyA!s#d>-;d#F@(P2hrR(4KqUVg1lvMy@l0CuP8m&E>2XbcvIClE>YB-BqPS146# zjaH{O7)@r2pMLr6kH6-p{@I?%lUwR_T<3LN_b>VWSATZUVMqPzxRXvh>%5EpcNxNR z)Hm0+)VJ2R)n8+}y7@t8Fj;JYP$ZT}Wpag*!{zahZ5hYy;pye=4a)W5)0c0*N|l<@ zXmxr6&9H#ujV80j>gwVL!wFI*_fM27lq$7kvF8#dgrSEUvN5s)3wxI{uVE? zRiVu)q#whA`04xG_P@TNv8lPG8-!7uq*-2+Ro%4udp4OZR-22fo4bdn!_vwcjltsZ z1b_+k*b9kFq0&IcLNBw}94?P95Q@YSsZ6d=s?-{-PH(8>FeGh&AaFmuA^YV6jltsZ z1R{w{q0;(Y=2yyOu{m5GUmz5TB{F&c{3%sxjaH{Onq15ltIh6ko>JFqOrrMiWC0jK zF`OXjmj^S)?}DsIs-_#JWjn6t2VoQ^X_gmdRX1(d592g1>vo*i{bc4`WnU-^jzFR@ z)mR*XNFr0HG&+OHVsp4WzM#%plK6m0Wpag5rPgS5dV|qqwzvQyOeo`hE>dY@B~lvA z-u|q%w0CrNb@%l4_4hOWvw^O%K2=P0lgA4CFHJYhFP7s4QIZu^(+$(IYgZ(BC}0$E zVUkvA4pdfk({@N6A#2vH`V(Z+<$9~-Z25fl9IRIX8MWEi?e%LpK}KViPeB+Lt7Xm# zWFvxN*(zl9XAR9%Z-Q(oh?2aMt z8CJ}BNmlgy=lDCOixZ?Dgi)NNSzc6i(+}e`FY9)km+S5Rcmf~VGDuIC3)oEK$PH*Gge%XXaC^H$TghSaS(+W&)8z5J~`PHE{j;`jdf<|QdW1)*2 zUeycpYoQt0JfD#0`j92a5#$L9BqI_!lc!->7200F6Wu9t?@x1r%LtfHB9+P8izt8h z@bt`w_2yAWvU-v=u6JMd$BPkV6%@L!N-&Yt>!7T&*duE&%EMWE|BV z#f+k_QCrg-`m$XYFTb8|S@;a?eKu0YY>_RR^&C61|2UcR&t8g8N`HLj&2%$Lsi#>w zFh9kk|GAXwfM#EuR}-D+LLS}dK`;8ykAY^;W>-r58GBd8wX+d>ACG`qUwt9;rUamG z-Tz(_Y~FYieen0<`qhWv)MKH=zP-;?Wm>F5AGy@Jr)I78$;D1NQd~K@dhrK=7Pm~? zj|nJy^Ucq*#~L$l`BCvH2Jkq2z(?NHp+DxAQ=0+T&BfclJrO%B*@9;*%(CKH+%~ps z8CubNR%>mKCat-Wywud@OUp>|rDgDmBWuapuqu(p1)VX)&rA~;%o_NmJF^eMoYH53 zX`e!V;t+k zF6nZv>>AUX(JW>+=ef>vehXgY;+C?E<*aaJt6AMXta0t@-OwgBx8-f__x5+P%Q>uf zvxqq{5~YL6fks5fC8nfje+w&T!WO;vQt z4gerN2n>P3DX3}b8JSr*xOw@7M8qVdWaO1p)F?r7qM}>;GtYh@%oR7>&19+>!X+zI zuh(ij9X7`b-`Qxpy$(6yoXc+d+kMXh-SvWAhLQu788U3-=&|D`PM&&87i)XoimR-) z&W6JGwA>0StERd>)L47H4K>kR%Wd|%{Z6`+lHNK{--#iDY@u9hhNAIgI-4(+tMz85 zrSZUu_;j|{=n=OyVLH;BlDO%HZPo)%**Fh zKU$xgACr&O=k~|t7uyg&jzrqJ={)bO3Szm%tUtlL|!nVwcM7{e43ZY$xqcr|pwzG+Z_o4SN<>(kk zXOiHFdAZO)p8#?y9=t+(homQtrI*1gxA(}-uH)6-mw0vd5U=jO!K=LQ@M`WUUbVfL z^=j=`Rma!itS%e*q$V^#OX{E{MYBF}ydYZX8?0+V{yseL&?ApM@w8{_=sAEInp)aA zx_So2CZ=ZQ7M4~)Z&@%PP#7G6M4_>`q&Gbo6e^9*V7{==pK?E>dqi3p%*N@@=53uyA)9$euU5+Ec<99Du3HB*Wa%g{&`b;q%f^8O zU?D^V6~iP5DOpC5Qxz&O2hSyZok!GEkYlLOVZw$BA0c9s{+N7q8D+;Rxk1a#c>%e_ z$nh+uw?uNAwnpyIc~|ZVSWoVyi?$;7iIoR@dH4_}+v}T4na@)CN+lh%4M__2!{rGr zyUJ{LS?nvTqeVJVHYba6x@c$0?rb@nE5`Y9x>zpB<#we!URhqRE!G>$=dIP$zV(OQ*Vh+(MtW zNTU|NuW?J3?yv2-8+3T@MED(z!OOtc-z zwWCI2M+?|{-RY$A%ue~oPJ3ZzytK34*tz=8&cpw9q2BchD0{Vxy#}7WJ{3;s zv*jJD2q)g;dhTrzDWcTs`de%MkF*&u`z5*z6lbo+uXLdojqU=&^X@JwT0@FYW{V}`9XPmcR3*x znbhcn=>hZ1{xCZVo}ZL!o1URDI^;)JTC|1^X_^#H^MVR>4tXl@$4dT)5;L1KJc}lc zqZ&T3tEQ0k{j>5+8qd4G_MjRZd`XH4lj*545xtRrWU)8wQPkSjtr&KT_m2=mwSY`w z6Udx{!8$-EuC}!q$2ajyEYb|KpwG+ha7Dl?-IID((4Bn8LSPo%izCR(WiyH!`Ww&A*FL?`=U} z@s_~$qMH;VmLjLC`6)>?zHSW?RG^bDv@*yveatZ17;`N)!P1A?>6RzWu+kbct#f5L z%hx<|REj4qdG3W|FTKMHNLBYRREKEfoJ3CXL-dq*${fFQ*{5eC+CKPsWN-SLavW}x zapY)&kEv=GQ{8^1VV5$Ex}0g;mBKXXx)x5;ZjEW)olJ}FV_J5KY1P9_>z-oT^p@qc z?VV0cyZ+G4dAra1d%7Gs3Dfn+Jw&G4frs~8gAJn(& zYx=DW8qhFH!C?HQlWbR_kJm$e z53g6C!4^80ofD6SDV99m7fT->-?8lR`SsQErmY070RafUnVm!-LNFG%04 zA=3lc^M1Nq8k9F!e)p5kUK>G4H2eQi4mf0tf1ESHf3CdcEJ%qfK4F7&wk1Xra`HM= zhU&NBX9Vb=j{!!QVum#~Ji?piXbYk-pnWG`^kLKEa!aq3Xbz$)U|tcQ4IK0WR0=8s zRf4KnGkiHAea%`n3_neRe&&~U+SziA8{FhJfAi1k&NN;7*UfU5`{l4$PB@F50T&<+ z5=?9(%)D3m)Yd@!8rtBTt)wNR>$~K&igRUcovAo=(f-kwZY-)&TT-RIluBcSN^|{{ z))!+-+rvvorKi1lc+jfOb#p#0*~9t#(^-A^n4QgI{;{~*kLAb4oLi>rxt0<8tGPXX zJ^sx7@$X5&4tRPzA1pd0{+OxXm2Y&d)+Z3Po4sQ%~czU;%Fr z|2*d-aK~E`S=z`-{Oplm?=@X7$GFnG+pfI)?r5+0gVn3=J;n6>shGVliuwENmc`d> zna|R0A=YL?^Lhn*6m|9qOzxowqz7Ofgbd0N7`KwRx0^z$GV=(U{KpLzwy{!S<7avP zUDR3ceI4V>PR5*elHjU2eAC_i9@N<8J+y=*OqEwxwXg1K3P@iu6Z|DxGtjUQEOIr5 zVyivjm(2-!Ibqc*i)J06##$zk~`k+T_N=WD?-OM}V-22SJmA06hkbm@s3( ziXBIDQUDijJ$gsq@_cFM_OkPhWqPJS0&EK=0gBqo?JRplDsm|`th_@qjhC_Ul(JbO z)fh^=;7nvvo9t@7CW-khU?GcG+?FQWVcAk`x!YOEDps>*SUYW5&$hNbA+wWR?AGvZ zIV1_I+Z!o?B+Uw}`b$7>D;+FCnJTH!7D(YpU%?RcIQQ)?`;glZqv1yn}5?};CZ35we;em1MT#jb@MaRQ>)JMS zINUT2$D;$rS6Ef8tn|R4iEiD?Ca1i5Sab!wtfZ<|`_)EUVSWFMHQcDvEoWuRUm?M2 zQdL&wW%VPjbaqx=S(UxjwR{)LxisUskT2Y5S~HVl3nbkQ&fTO>S9XTa)Wi^VzRXpo zrafa}Z13F6xa`Dm!R3T`TGE^aNl0Rn(p{C=Iix}%Q-a;zp7V2|rV(W%aXBT#M+^-$ zk>p$7``H>Bp|?SkD>B_Gc$Jk>^7Das)B+r4S{k#CN0Hz~1(* z##-xbpwT8;>_ri@9*RpBL*6lm@=%e4{)z+53g^kiOOUhTkYPK34!5~lw9D;@zA#R8VvI_DH@*MI4 zIvW}SjfTcS=R;GWAZRXB3iU#Zpch~{uw2;ntbJLRvp402qKZ*fsD|xh+jni>yWQY> zZdmcc&%3-Y27-DbWa(nc$lmp_mb&Y2=q(pdwJZiKwKLV3oZH15=hq2%rG+efG122k zSm|o^YPG9h|8{qH{qdj}G6ExRfD-N3O zt7_V~dDl^JBO|v;I8##R51qp}v(LnhyPAR#!oUX38krq*p70jW6@E@U;Lk#_E;^&Y zf5Y0p%*)(=YD=V^W=z7top12(3Lu@uf_{d z5cI}S!;CNz()Vruz?X}!2aHj??+af}2jBWBvaPQI_bxy4|LE0Evd8}O$iq3V-BdDW zmv>>smzAtb(lW0=zjCksl5g@X0n}fo!hflK@!@djE`Au_`r{DV;mG{ZZx!7)?`}S9 zk3M8;hVhtsZhGYJ9-Gm|H)OVcb8??5B>yr^|oC+ zQc(W7ITUSyM>}G&oSDG_IrMI-R%kVRM z22M*==a>#`_>vb#)Uvx+`WdrD8VhcpkVyw7U@cy)DlN5xg0i26h1Pv|@ejRYk!rd1wb&2(ay zd36*ksEN$b%eW^#(InqWy8Pn!Gqk?rQB#C>EKLJRaJ^3N9pfyFUOM?uAEUig5CEWG z0--bv91;f3Aoq^$(cDlu@(4QZO`QT!X$>JH3?2!*Q=SDXEL(s1ncgc zFX%z{ER{eagut*fFd{IU*9owJo;Vy!%u;scC4r@9>(daxU@1r;<|=TCRi+-orn{Y^ zRx=wyA{gG#oZdJt%*B3jQn9*n%Oo!vFqhi+39=^CdLI*)3YLey7icSjs2E)(8e`-P zi@Wgh!_!o*`bzUZ<0+X)g@b1QkgblK?&>a(D2w7DnkPJbnNABmN7%Sxq%sSy3%6OU ze`-mV<4M@6m>*S24J*Lj>kbvfrQ%$#KX0?unN~w)sy7*vJLoE|EgF|H&>o%LF_f!s zB4C`wJ2H73;jEm5vbgGTGd(nx5DJKoHolbVIjed2S&a&PQ>UBmKJJz=vOV>FA_}z5 zTkkYDb}H~7kbc&A<(WqhbI&!mbL$uu zc0Qc5^Z9)2X&F7QuJ?Vcxxr)9R7~7xFDC7`FJ-&i+x`xBWSlW38f$_{#+xiK z*?b{ay9LyHpwQf%o3#tG_upr`G-p@U61lUlzjNI=zF?j^*9ys8>-xd9%6CKE(5a=h zo&D`5g%1)3HI>oS;Fgi0v5C2bnXRMKRE4IPD#x>mY38W zzu)=u?#_FE-{0-%7KZy*2g^fsr2m;?I?c$IV_eg+G>9?7>M*@|OU|}^QP~}tLoqrWlQVHS8@E$&crz2H(sMFhSF&_9EBCwa z-z9mu!GT0#P-0#1#76(_*Fz}YQWD;Y1ol}%JD%Dml)qC_~s*Bnm0EFrTXqc9M^f}y%I-?iJ>lG& zwEL2AcT%26)uGfJPTi3-9PCC6+Y-}0iDlbEZf9)U6>7U<-HxPpG2AXByU$Y`=2v}d zgYSLk2kUK-(M01-FzKa~k-CW%{$Sp9+)2k=6l=CvapLy_LIEGx=kBPfSb@U*foMT5 z!}p#9_rz_cMWZG)50XI}U1sx3D6#m!s#NPWU*B$1_^?I>pY&uTJ6Xxh(>#v**}5oV ze=08VRx0BBC-WIDCR64F&$-NHs0dAO>`Gy!DpIjZRJt<7RkY%j%s|Ep2GH zF(Vc+Bp;GXe&mEWtTqKE#GHaq2zf|hLewdOoKY0fqZkrIam1Js6Jkk8sD!sjWkPhR zf>=-$nWP#rNOfd{8i)xs4|EVIq*~wrYKwz9ib37Z@(^FECxQ2M<^%os&>%iCgpUp5 z6QlUlR6aA4`c~0EG7a6Jky|vDLX+YRO^HO2(G10l<`aq^EoiC4(27t>XpK102GO7` z;!HcNG3^msIt;tsVfYRMCc^fZ4?AEx?1){k6HddgA$d$1320{aqgupfzp{mC;pfV_hPM?OVk|6rsQ4uK4@ z8wMi|e1p~CTf~v?Zr+II42BRQ6OdcXLUNdmykrjYoViFV^RSxC$Lg~HyT(GSE{kwb zSd2uo1es?cjA{$`09KCj;0e1lTPG_Q(W#<%NA>VZTyvKobtC#~~kaSVNBZ znWK_8*4sIb<9kl13@5GRl)ap`hBG#D)&U5kccP};{hZg z=0MVps3|e?#H7Fzq#))+O2i_SnJY>KqLA7w8mj^+NJ}h^h{peIN%@rx{m*1y;2UJX ztQg?}g~&v#1DRcIa#SKVf~=@TB(V}?LlL5gogo_i$WH7CInaw3VpqtC0pucff!zLP z4plPy)P8|E#1eZ!zMkm=LY#sEKOC4;^^6lxh#&qMob!xBp$J$*QFCIiD6os-=ID$U zSV2kRU?_zh#1W^V^k0rmy88FCP!{Fz60Z|D59LGPsIXjQ_EmDodyas?1*l9&Q3WnW zRYHk3;4)Mrbf^y3q6T3@O}G)Y2nMy`dekB8s7uhO2e+a=;l-Qq78=}T!d8F>(2$6s z5%K2r4knJKnR59wrzyl7n$^|jgg8TsqAdxz3#|g*qqXDWumt{#wjn;yF7P|rhdhS2 z1HYj|NC0#+zZxzf{?Iuv81IC{pi5v7-gTnuLIMNvJ|zlW!HsT|x9C0`zNMQtcFA{? zYD6fx=m{=-M5#wFpwXN13Vnb<-%YJQx(Ec(pYjC*Ac=vL4t#v1Fz5$m!?~Vi7(>7f z7)lw(FsQ=tn^8n(9YtVfj9zAAvYap&GsL8jG>i+pkMYEOn4qZ>2`r3Bfu&&bvJAK7 zJj2wl>P{j2ICvTTH3imim^ciMU>!#T58@a_9LGV06O=rh1U*hs zUf{H8b$~=E!dWA9hD0gGdC=hkr3AmD5f?8L)rC^vL%jMvM*pJp1sIP& z1RW8WnXE5~b#+WW=dOtfRuU4kL0^*KYeHs@=vQ*x9Q>8c@jXgv&rJpKB)JAzLT%p6 zPBGe}!4mN!LG-;2CdAK#z8}2j5t5oPPQmc7M6wfRye2HfAB44o-Vuoz+Utsm8!wjZ z_0Cpwf0vWM-Ux@C?S2xti*R1k29PD`7Wcfk={aM9O`}oXMde(ub4CO#EFZdvwmq zHTl(K9G{ymQ$H(x&TCo`n{YZy;C!NNhE-_caO3*~Gvr2KcSNoHY;^*&5)DhynZ@$e zuUs~ZWU^m+xCBloy1{dzM|?x{+rb|(znD|t5pv5aobttd%WwKSy%A%?L|<)Fu8$)l zeXGw)FoswJvx(*U)NsK>z9-fl(IpB5BDPiUZAb7ev9B8M+bC$RYv1L%nDMlJ_k*rfwbQNy_la9@kGPY1h{w>HAcurJJk-Q=O7 zw~**dC;f!#R2@U`jKp3)JC?2=^C*YtDM^q)5PWKpB*jOPs+r(v#~?`~jga&+ zMF=zYtjXwao%yKF)=vozldRw<$qtT?XTf-qQ)f^=r%v$B7YlzB9uNZ{9A+>wy zI?gGG#YQYx$%p}~82P}OF$&yQU=#)$7)8OxjgR>0WWWc&X1pJ4VJQH%;KLpA6F}Q;7f~&YUxQ+*b8;tzmCZiy@^)iZpckSPS`+~dR0pK1^1o!bk z@BsG*PjHX>TMtkfh=Rc=8=RUEQ7sY*LrR6nr~o-tpr8*ZsTvi|*6?d)U>;2Gk&i@z7v%ZZs0sm;Bgz zQpjLKS>&)ro@}DdboHj9!9tDsRw$q&hNBZYV=TI$J0_wBZMEv@;~(8N!>7NZ8H-eg zUh3Zqy~OW4@o?J&82kD_hrh=p_G`{?~k)x&azA zP0`}a(ti649lGY|(YLrCneS`KW8JNF=EsWiXlHWGuYJliuO+j#uDrg=f|ZRseb`uD zT`}ADE9V>g)9dz3-nGoauH@X|G{0jdhXK8h* zNhgD#MFuaKPCex<%b9FGo;jDp*K-$g`N{KNK7R!+6$((~N-^(5pb`oUUf{9PHv}nD zp05V?2Wr|ZK9qI|qj z+_g;f{ico5AHfq}DJqSK)pVoIzD!&M(ne#~qfNXUITS*N6HQALoh~Hlrs(xdvI*(N z5Ze#Y?f%D&(GYQ}jfrA12)v;Xvtf$X2-1vFEXI&-{ExAkuxZn`R{;VsP2Whw878OA z=CB~s{6_gEerj^sXsZQTmNvVkf@~|B!(Q<-lhel7E|YU5%4rkNZEY@}#kp0GD7T-J zN7_6Ni}USGo7Y=$fw5_0T@@Evnl_)G;vzHC=66zDY-8F29*Rp0Ok2=BnHLtNTgV@o zQghNR?2JsAE$J5VM5f%36p98`VMPJ4un#^IeT~4HAhyGSqH)<5+nM*G@fjD}mFuDj z`4!up*`kR#6|yIwNr-)#&7#SX7u$OkP06F!z6=&k&7Ii(tQAemmy}DBMANe)HkFs6 z8MzRf&O*`5_=_Eke9^3!OPMxcnjL4c!x1i;6I&_k21aw^Db^mzqG!iYtUr211L7uz zjabp*Sc##dRJ1TYVtJ7%Mi7(t4as|7E(k~Dy-u0JQDqK5WC1`p~rx{>Lnh^;! z6D*Bp#w?l*7NglQl@@|+(8Ab3OTfNpNt~yZ;3!%dw`nc7gw`fhv;ka58xk_w2(F-w z2_tO+SJI}0iMD{7XiLIHTfxn=HQ}c1;0D^BaL^9$G3`i9&@S)}?Mn2}ZtynkPIS>8 z@Hy>CEYV)@1?^3&(0=d}?N9EbL*P$3lmw&0;4eCygrMUPpyNp*oq!OXNRsFzgwx3+ zl}>>nbSjCZbC8G5B@J{53e%;ekuF04x}1EbD^Q58Bwy(^R71Cu33>?rrbl2RdK6vI zV=yT_j`z_MFecEGXp5eLvFT~FN6)}G^eo;+&%wC#JUXBkU@V{)(GI-?BLTgPX6O|d z1?W|@K(E25K(C`EdILrSdK0bCTQD-v+h~s70qdf7Vhz2k@p#@1d`0hp&Cz?CkL7)U zRnhzL1$_WkM<2v8`Vg#vK8)q`5m*y_6f5Xsup0U}meMESIQk_1rcc2!^lAJ_pMmG- zvqX_T2QSd)i86fw9-%K1N%|5zMqeg4`U*TwUnSD?HF$!)PGsmC@F;zgNYS_8CHgi| zMc;u}=(|J>eGgux?-OK z5J|r#)$|)=qu-Jm`W>R^_v9u00a@vfq>BE8()4H2O@Bcg{grgl-%ytRPI~Dds7U|( zoeVr(W8jchi40AYXff7`1v-rBL%w?P6Knokak4Fuqmlwun*F82AZELwT2 zHlABMP3WL;oiwSN#`G*~QLnzR`VAy*aN^kv@o2*n&tb%PKTS>a!}P*-%$QBnocYv! zpLmo-p54;I$5^&DBI`CfwmC7lt%W1A?MD`V`jwgA(>odZW5*k(zu-h1U^5WKsq^ri=)rObDRN z@TM#Ueadz@2Z@xc&P_b!Da289{hl+S7-&%(Zc@p@sVdc#iJ=;>qq?9#AHkaXH)}3` zuCGzbB;daWW1hY#4AZyucRZr+iw8?T)PEvIf8kt1Fh@fRL-cn&40~FFd|Hk?+K3w3 zghJYiYUcCKvy7Y}%fcD4815#ELmMkz+%4Alaucp$P3v|bSbI=nBRDA*nT_l&CPx96 zz?IS6rCc6^D`VkuIS$=r<#;q7J13yKq@0NE((*34D_h<3{2&NdkPm^IBAR*yG1L*n zrA{FcR5~OIgOY)|h-9YrBiX4vNDk^9l7~8t6zO$Fet=%PWC!%RB0HnkIoSohPRhNY z4r7bMEwB~9&9D{3EwL5B&9NQBt#EBQu8C`ha1Gp;iL2m_DO??Q+}Z=UD)!Fk2lg(s ze%QOhAK3e#bJz#KI_v{!#jq#BRvho*?l|7VeQ>;w{^IxmKF9GPdX3{7C7^Vl;(I8c zi=@RFslvlC0RPPfiUXM~c-v z=-E;7fQAFf8YHkPjH2}P2O1haB|W?fJUwLom=4r^5|Fh&OPWya+D=(jU_CIyhCK`> z?_i+I4_x#fv?qQK&tCNpWL9UiJ6d}kDyz!w590lmP(iU2S0BY!k5PH7ZTEPvE?r^7 zo>#Fa!hT0`0O$Xsux>-zpgMWV`Vd@T7uhK)VI?eLG_W-6$LNrukx;DN6Dn5%p`N5( zxa!;pbB6-c$x?ecO0P!Az{E3`$Va=FS55g;XDC*i_d^>K-)cxJWxE!G#SVtn!*{A2 zkyL7H4i)IU(nDrJ+S~n6ZvtiCqVfP%FeluhLkgC%x%a7fv9pq(Ve#GG?)30L&vDuP z#2jKYvGucAAU;&3Rq=A=aFL~6JnMGo@IYiC;qVD7JQ>wTHqXFv;95I;h`<~M{ZLXR z^D<+LN!{1NQ*Vv{Pd7sLdKk~*HuljG;^}I5x?ZC!s~^HReT0n0I-BzC?id!H?TBCo zGM_h|z@`E2n5Ljv3E6N4+8Q*=ZRU#wRKs2!%OgH2D||k5gMy5qUush^bu2VeK#i#h zHKlrLpk~yZ!*w*w5@y)!Cw6iT>}?EOLAQ=MUqkI~vjv-A35hb~`mclVij&u-=u z*}m*JgBneAy(fVg?M=ry>JyFQf=mm!OWMIDvXpktsn!IPK|TF(_x}qs(<&_KQAVh~ z|3M`4(aVl2fG#NZK(_PJ@XCJotx8QN#_hUIt@@i$DC#LR;_JCSH?4-xI-5BwJ4`ln z5WP2HP~C*Gg*Hw&ux$#C?vRx>MA^9e@BPA6u7YF5i&wdhZcqpmqG^NTEl^mq z4aZC1;+BQLDw`VB5kh%=VZVGe8-x5l48JNSzysAGwImx`K2%?4s;Hm!iXr&a-%r`A z>&lM3DGbJ&UK@3e%tenm_>?0xXYP2tY4^s}4BO_MA2x4ZbIR48jvmY@85Ybo1|`dz@D}V0Rt^hpAmnkt&!7~r5C%dK2jUE#5*E@xDC0n$ z!Kq-O41_8U)ETrI7TQ3l)|7}1>|t-P za)=|&4iOg!+znnHam3pp;sbH<mv%~bHea4;%@241*T`9*HA+k zg@?G>_+cN#?G0GW-Mz3hq~#rCo?l`@@?|@l(ITA~UYba&0n;UyhI!&h;baTj(oP4{ zp;gGyS{bo?XOm3+-`)adfCOX#3-O+CiNekxt9$lXsb#Xw#0U|HtPu@NTEVe;UQy!X znM5bze8#i2MMAu@cl6?Xdb{J}srsUf1rWtTAytL^JRF_W5hMaCz&bjRQ7Nt_DMR-p zekFc`ULc0M`=$qVX#UzRb#2|iWP`997?T2DO2l$Y8YC2{jAYwl7mcSDGf){1RE9uvDKBB6yTmV2i%@Vkpjv=)N zh$cem75+oAM369NmY-}H%%2$<4?zPW3U%rNu0~05*_QNm$wUsu=^hp`sdShunVRKX zSE_7~7L|%n5sJg*<62(PY_qL#tQgZ^sDk9??hzW(ga!mH-V7*T6{3`{Ml%d_S+*6F zO|bv}r2I{U+CrW39i5|5kWO7nkC>_!1Ul=ru;aJLQmqtWdt$vp z!#3*e{REkws7p1n4LvIzs=#DO`70uVz1VRE);7c7ac;=$MO?v;MJ4z}Ww8ELLhDq{ z{$N5Tj<<^{Z77?EPvw(B**T_n822I|AD1E(oz={$YV2qTKGiVeUog`!D5|;@J!MHx zS(*}}KuiFNd4;Cz!*a+MvaODg3NUpQvRM(1eAhe?S8Ha^c62PbQDhYrRe2b<6dT&*CfP7pyq1rS8gH6Sv_Dag7m%{{=$pB(d&(FL~iPtSu`TUWGYIRK@D zMXZNh-VycZ^{|GAUz<0&|P#gG|90(OSO)aw;G zm%(P6XW@7qcsl7kC0akChGrZ);+4Sxh@hVW2qNej5Sim-XKTez%h|WH61nmRWs*gR zyhxKM{l~*R>#jz-%WkCEW6+2EWM_ne&g|1A%TUG-0%i$B(0k;8uPILHpNZi=x=}gvryT8FSqt zUM(+?aBy(omr7&~1xBC)fl++NG0g&CCHVrLW<4`QUxOUq%8dndfu7TpFqm>DkRS>=;fl66EgY^qwGj+ihybz$(Qfj$ixt<@d8KpAmKA%F{2pAe z-WwVw#316uuw?^WIPkudXdG{WA99MP>C{hn^$JI~_kWBjd4G|w`O4r+3*~#JqxoI&a?T$ znKHjIg`SA zA!!!s#mmJ7`#1-Z*#>10MX-H_tqE2u$#}uOk66cvnEuB4c-`78F6}cM-4H4UVo$Wd z9ONvqzJ^|mA$2fIJUD=efUNFK2@94>A^;A8yIhF;Q~+W`$7{?0>momX26-mbskB|U zoAu_+3yR=1^-?Mvd{VW>#YjUXmWtVc*Iv($me*QD*e+sZEZ7dC8>MNrTb#kENCANY zz~9Uv+IipNlI5=>WiNHdgkuFL(c@I5)QbcR8oZd9y9Y&ijc($Fe;Xx=I0rHURHXt5?f-0yF*m%K(ZzU5(G^0Gg?i8g+j z$Gs+v@vnhk2|u=pNM|~Tt zMG=>|gmGjn(-JI|;@V^CZkeF24}sX_wxJBUOA97nrOa$$KW+xdJKlm_h%iGwvnxU_ z%0jWqp#d-xS@Q=dx!nG)$lqw+U$NH;=~c;)RxRs#O36JT>d;(M6V}5?KNl6K!jr)l z8T&>g90MWGNfMowClQlWBdfQZuQ;FI_KqvYIWsK)`DF^SSN@A!hE_G=E(vgekG8^t z7b7D?lf)WLV&!t={*WTcQP@s6bfNk_ecREG@8u;ZDlrMyAmS6eYB_QQ=%f_Se$}dw z{(=Lx1gJS+Hsa`cngaTtE)n(~M<3RCV3L`jDW!sn4I1+Gb4GyRQ9Gy0JW?gnu^Bds zZrl!5r`UpXy|JC&a`eY@0Tz4GV2i0 z7oIEdKtA40tecieA8Tf52pxOWR5dn{nag|OPsV=j7t?w!!mBHQ84y+7 zQghPcq+_ZF&88ovlsj-!FET-7tU+T05|rkb*@^Khh>-~%7p)-0q9OnX7$++Fye`K@ z8AV5dyH5%<eoKo1h7EWTu;3A2OhqnWLYpLH-1`L*tPU49(E&81r-pF>`;Y5K&j62$RnQu z{KKp8AHUO(A?RcDdV;!8h!KX7O62!*7Rd#cm zQAibz1Z@Kd-5i+*M9)4=9YX<2E#4%?QqCk|EJsa3wE!iiMJ5PLCc9R>1ti(NsyZxS zN3Ln=sU=(5qyHKP?Wj3&`!KJ*(H6l{fIN31t(r}HBWVCel*ydy$e>Rh{00563=@?- z)Q+KnFc~5lz;3y092$}$iX;z%(+K8nf$B<<#xk(RqukV_&@@Gpi$t?MmX|V`mbS%M z2)+I|Pa(@1E!ib*yJwqk3c0t${Bc7Mu*`;E2nP6~E-zL>Sk&rvo{ZpzIm!9hW@F}W z|7WLiKH^DHfW9D?=`iUPV}v5n&+Gz=#>T=6?pbF03!S3E!osdiFht#<{;ovEzD8)o z)TGjpH7TJeS{)TydsN?a@&~ ze}LyKN4X@xOxS;D;J@#af)a=cNAsmqgew{C;m8wJbOA?HJ+3jY^ZcU8i!MvfbUXP- z5AGhNzR$e)JgYx#`jvm0%h0NDvi?FeQpD0Rq67hp9q9l%S{7G2vB61R6ul50S*}~= z@*Xazo{-iyU%2wMpGyKG)o+6$`aZ=2s*#Miib8A)n#W6R0n;vA*4@&nZyQx)?p8;? zK`eHMn$!+0n*&-4*oI{z)ZlMn%5bK?+B{_me1n(@dX-Qy}Axd9x zHAZ>bA(JI&#a@~f42?jh$7>~pKWym~Tgf7Cx09x52wsp$$C=I1mubA#=gXM(jWYBs zs)ph%iGcQu@?c)$qex1|K>Dy3qmZ-uMSapHU@f5lNjKN>l;`T+o8aDSU*x&>Z~;p( zCM9x8aq6L8QhLnf7pbJyKv0N1Jlp!@OPg4L&@oJ?knb`u&Im#$ZLtS1rb=G76>_A+ zjIP?ng`P5Ln)YK0NK7<_NNP!=A(g|)YmD*r4nWS3cj2DP1eE%QIcjznGq5f(JGUzJ zU(xf?b@LopfB}ynGBlO)prkI6rb*?jN@o{$7$z!2N0Do0B9`$KAMJWh*_+Lp0FBU8 z&t0@w+cped3u>Rv5)N9b0GftBZN_mvw(Z?tnptSmh??{lAB@m8*vk~cxJJBb3mge; zH;DmI%0gl8lK+*wW3jeuO{oQhDw=QYMLcwFmve}Qi~<2d0iMh9Ba!E?7({$` z%S&D$7Phkx0(+)UU-dkTUVb=x>t|hmtTll!Sr3`Nf6u zKXAXrF3np5YlQ@RnZ_NJ5q{Yh{;SW9NxIDrQ+Yyk^seSo-4g~&dh~Ru+}nn0Wop~$ zQ@(m_*ot=z(pM6aASPxmK^#5}F$0+SYa29V92CJmZ7w~(Vf1)Gt6We|9~q3Xb$u3W zYSU5+u2D>{fq0{-?BTLWMfben`75LalwnKdE6II5yBQ}~JFjtG!+`~!EE?~k&{}M5 z5Kc_)520kg2L$fzTU(>mo-VV%QE?9K`X%g1qXjXA^&9)(1WnL(6?Fcu#a18Q!gt4K zIK7rMEgI8VO=y0+b5wPif>v*kuAMyvgj3UbH@he`PkVWy=sdhs{P#5uOAo*k7V%Jf>nxu%(VO5ilFxEhx+I(|ZFDH;10n?uvqj*y8qFhlUDHA|gxNC%v4gs{UJ*swpc@*qy@PqZw)^q z5&InHaf`Ra(8^<=@eLx{D_%A)y#0v)ZI2qQT!6K?wP#wj9kzZmZFA;Omf)U7t_`0r z@_!XMp5Mg;g9C~*sq4CepMZ&KwQvi&XzDWwejz)XK9fEGpZK;{ zeWjNipUtx^)kn}XvZ-^Q5u)Gn)#UywSFPscggyR6tKL_0%&UCzzh)_5T1j31UQZvs zU`~;-%F~$TTjZB-okri{wwBf_b>u=r2ao-y+PFTl zoN!Zs{?-HDp>}Gp&h|s~EY*Q;mDam#8%9S+P!b}q7t%x=^601u#5bU|aLo1>JQTq) zXgDvdQ|N=y2?_kd9(gV7JU8;)7B|e%oW5?TAt0@z&%(Ta2s~~bVj?LD7>hgkGB%Dt z!l{%eSe>AQ-ook0l}-o^`K+g`G1Q{wEwoC)ee@>EZdcYy*7UbY))}!AW0eBQ4c9AI zGPC7Q?&@LkMYoI{OF}zFpAg-1SMw+OB%hL%Vf#lk2ZXO9$7n%=9EUr~hRynn(qSV2PV+lG)9F&))8&zIN&t@|3b|jPO`88=n!4|Ip z_%4@mn-QIEV;`UGTbn(;-mLb5wJ$51xa|~V03?zN{HUCG3vmu%7_!O45>{8 zD3b?>9G5)O$`}RN_95w?MKZdll}D8NUONjS zS8fL~53o2SibxtQu1dRvo3~_85N!8oUDq$? zBFqI$5YnAOV3=f|?wJpMMf1~U_glxWcla6e{2U8KYy*1ot#?NLV}KX3wk4MXq+w>( zzd;6JyIyh2m*e~FnOpKBp+6AzM|QZD9Bnh#QiC<&%%rxt_A&$jb3V9pdAdMww_-VT zfvmsUIc*9btHHVW(61?({zAXw?ow+ZUD1z???YKz-?MdXPpil)Q86;2XMg}9iOC%= ztS+LEwSD9O?Avi7XD!b3#Y+7UcSv~7*L35zVWy|p1QMA{)BP3-d5TQ%&vXMsz5bMm zk*}-0W$ z3KJMbv#?}_{Of`YoNePWv)IgPtD8h#z#r5duyp=sVyre((>(G6S_C$z9 zp#emv^lRG>6DESJON&^w-~L$UV}HKE5dp@E2|b_|h)Hs64>d*s9f>#F`FQ7e*hht4 zFUGlH%t$`jQ$y|K!D!yeb@o!Pd>|AElny0d7H@6L1Y$4y z{ll#|wmSql^B-t1xed(3srT~}Ubc}ctyUY*L2ZbDQS@E?x));21ZWV@SM6B=GTNO^ z0-Bi6UJf(M-YX*I{&>#2l=O5@dH0t|t0M4f$r@m73fH*1BCQ6#2N6#8#n6BuqI_E; zjC0|UC#ukKTWoWnC|q`;T!tZAJPy0=s31skWYO^Gl77J|KvZcY@JJ98zC2efcNfZK zTowKw*Kg9ixII?Z#ob0@pd{*cjX;QO0;puB6 zT$HDmpO}r-bc{ATtcR2w_B=S!bN?KGE=_n#i0DQjqfR3g{8tNT2IHY2fPS8U`1JE# z7YK27N5#+Hl8dPMKe?3H^OF)v^iWd6J~#HcT*Q?Wpl%f#KSkOVK=`N$nphGO$=*S5 zZULob@jey(yLPiTiuqsiHI8S>PyOlm49vnOx2te57wh1sQS@Ge+lXhUejHAU@3G?= zXR=2_6NmR;LO+8~)n)5iej6Gei^d)N^P{dY^@UINk0$f;t;%SN3(N(Kvb zGjb+th+ZHM3V0P)B;{3}w84A>qn8$~FG_3-$mLd{*Fi5?QJ$AFc`pzek_fv*8uSC5 z@Y>)a+<-CflW}P-!x%#jr$uJ*9YD+%AtifVF_aPLI`(Oa3O#x67DxG-~HW_jm+SmtBi#y&o_U{4rTq${%!88)Seut^qZZndp^B4u73G z;N9vM=kR^ZgKi&vvg~{KrFEz4l+iVSn$JuWe#2JJ>d)S}uu8=5#iAAb_EPj%Y$mZ}WJ3zOKu`ZmZ! zl0CTr0jYh}h$mN#f^EMB{L3|GMo;GjrPFN4SqpIQ55)`fd^G%!#dA8EEA7`C3)*!= zVfnF>BdzE+?8O*T=ggOB4(|{P3Ky?u8_INynv@RG6N&H$q)@?PHfyI^Y{d|-M^sXl z+O&fR*6{@tfU><9%~sm-GcRv!uiEJ2kzH%p>OJ$TV?3mQzGXhR=r@5)AB-T9K(c^i zz-l+D&KjXe16sJ6-Sbl>ph|$@f1(%!vQ<5&d%^Wxrz76}mToiw?$}aR0?Y?vRGd>~ z!LH_njfPsLV8qG{N`Fjx_FC)Urhc-tZ$-wDl4T=On;&Chkex*zZUC5M*jk5QPe}{j zeN!UeT~ltP;3z2fK$}uK29OvL{==W$q^RJo$OkF)CM2c+OsLUI6#UWy#br**`>?{3 z{E`wSy?DjF0JRr`dXWw6q@NbHMPG@om1_*slEen;inYa9796(tmMy*A+H`@G`P01# z(De3D%GmL^ID;y|U{m!IWmc_f=e#Z^!)us@74|>+vPWL(6B*!Jz3d1O+n$D(Q3~C2 z2hYX>E1vLP8H0kgUvMyw`rA8sVB+B6qx8ukGP3%hv1`GUV|8LOpgU}YLx$ouu`X0S zI?_>7;B>q}x~GMAotvZMXJmW#jgyMqirr1-oO^(O^RX(<+UI>69>B z_bj7NraJbJRU>Kee1qr`#VfH((n}3KvF$ITTS&iwJj)cZ5vVAfK0Tj^)9cDMo0-w5AfoDriISY^A`QN$vhzB z#+LPHR)lOxnc|n>bREB1j7T^K`iou z40&i*Dz$6c=fU8DxY)xfplq?&j97h}K}PeGMAm{YQPn8i+P0M?;xL8tiFMg*) z-mx-WUl5=hIIg4~UBubOas}8><;e;G{!?5GuK=YD(R0NhyWohtj>*`VaP`hXB@(=u zp(AG2v;wZ4wsM#}HCp9oy#JQl&x}Cdh)B||nt1K;St~=@EE97)lJ0sPbTbg0dArxS zlxv;}*Q0mMZ-&uOuf)=r`pwN0b=Ii9bP1K>S%%*@d)iOHItPs6gMqa{@vma20$@K|yyhB+8TQH0LswD-??>R>o+oOVwVnm!|4R zJLEVh6k3b$slYoFL`4=Dn8b8ISWcf~BcqOby`h%m8}D=e9d!HFzJMmf!$|Hfc6s#3)DT0R~=3$`SRI)FJ`V(7@?UD0Vr`htoJAIcb1G?bN;RIEM3o z8x;gpMyRR^7m5$OrI2s8 zG1-+>!Ktk`*yBttuu|319%45qmbcZ3LeLwJA+x?M@gUFbrF5|sr0jPWQPb@4>V2Ry5G?pqB;0W)Uus+w^bosxxBYy9qgRD+ z45~Cai_%joYKX!+HRX%CI*f%hKUqY9#-5R^2dDnTerM=m#dZhmN`LaXH5xBfP8MC$ zU9os43Zx}TPAW0a3+a_CkATHMh>r@Kn2h;=@6wudvOdp=0w2YVG8)6i7d8W|qj#nwE=5j_k=b|RG{z*7 zgkoEEe=#J+ve3VjDZu_-qWV0F1ZZ;6F*>no{-D|eyA!wsJ}BMn8LK(8qef?kctQ4K zuSbh&`CRAlR1$zp%kbw41stO1w7aFGxht#pFQK5V#KjrY9%l5zN9y=UR$DLkPod?N z$O~7wUxRVHBCsizaaW=7Gam{|!i?OoV_)9B97!@StVd(*D-b&JABT_HT-K$<03q zFYH!Yc03g_B~pu#0US0e8i00Rv+=WkY3pwIA1$=nnd}cA`gFV~nk+!0qHFG5K?dfA zJfjVv6`eEbjcI_5lk7@-mXW|Z0P>c_FR>Q`RbEH%==67`-K?~wsnw}9%?mn9Sl7u9 zg^5ev^x6+;5~Ey-CBbj#DM~RcRe^@=mF*HM%CD}v6|>7JF2yDUVGkBU*xYQrCiEXL z;1JWpo(b`0Cf|Ux!mpfy`5kT$F)Jmbn!C*f#&59Xy?@P^a)xf%Nk*57w#nzVp>l;4S`uvA#h4tNh_TvI z>id9uoaoW4EBInTtAo+2xD)5iT8QIS=IwLbS%XI|~K(@qG>PKl#FI;9t4yr$oiqg$xN(B$zXb;p60!sGUewny1V5&^7vqymDig1A&yGJfeK(!A{A2yn~o*zkCjNTZr z-ymH!#Z{U)H|*t4!-$t{mu2aJW+wJFlCTqOlZ#3lXiAAmgh?gRc5Z@TTMUGYW*3J@ zk2;0TLBe%n^L!NZd)m=i5&R{$LK8b>X$O~!-`fm!ABrUP_b<+`@<=^i2K}U%dw-G6Y|E)4VL#c_MN;YCn!y(fs$eIQKBYvSfHDlvD32Ke zPrQGCT-8LISDTbWNpYunM#Bz4aG|VN>bCAPHtc^iFy{KH!`qa7+lg0Ox!dM7(<>m~ zYAoT6hcZsA^k?+ECH?n=c-5cqvj?8guC1mTPuPR7By_+gz8tLx-d`bs?;E#yZC{N08kezb~VIx+P+HRcX; zto|ZCT!yX4Wjs=@`n<-dqncmQgC%uZqM=Z-(@tdik<(=^-F&4C z=4y|%g$ZLnUOV;}x8M|=(-@!%O$x9maij4Ikrt=ySd6BS@4%Rf=v7?bI$%xhj6PJkgYR zud~evNuIkUXREsjt!W$%DJgFsG-pKkbjy_ zo{IH)PRTE2Y@EqtjkgC3W+M&QcD7|3m5fAtZcz9uD=`9+bC3;+K@f*-xP#u~QT{$d zQRV^BHFaPGcok~Wjyh7XDw;rRsV& zo$Ht9y|X}b{qsVPmP{cBD zdv5&|uAX_x!xR(-j--=aY>NA-2O z`W}8SN}`U~6rcweV@Zo;tCm=Z6!yMzaO*@%T$U!k$=F{!W-#_HY!2k=x^kQ)UCuI4 z-3Upkt zf9M(lq#Z9Ssaq4~<7t)m&4>5H{zh&%UXiAonNl%5sW@Iu;rZo!WyulR`6F+ksD;J; z!je!Xe#(_vOqZiqFN!LYFa?w}N@z99yUe0qm!B0t1s2UY)TwI)`SLGUy%?QhhzmvC z0xMD|G#%odVP^{FJkQbIE8CxKf13JpJj$bWDz-#xjiny>pKye|e>p*)-Xke=rA*-A zK??e;-o^2zz*JPHEKst|p4k`x=hU^;Ae(XzoO>k0fR0tJtvM0NdUJrLkdmJ47QVMt ztS$_@9kQC~x!5On)BvT_GBp>w^M#IB=t~L;F}>L*K)i z!|N1l0Tp14xk}H7*13%}>*wO0{OZrA`m(CyJ#RV628;J$kk;U4hKEk6t*=b7Ht9$d zJK9VuM9%^LY^YL|BwAAA*>A9805F)xqmO(~`+mt}=?9b}+1 zdeB1DgW{G*RR;#$3#E-iiwpt5LL?HD@KEH^oXfzMc1vYg8+p*Sr%Wf8SFZeBP}{!z z@V2_B9FqQ_GC`&-fLiLG@-SgXIAt5m<&13G2s1Vn-KEL2F-_HkZdjPsR!d#HI7QXb zhnXnTZ@MTUVWNuZB)VRg$ub$tU8!%B(B5>Yx%GnDD(X~JSlDrrex*LU=ac1Bxc80A zyL_@;vUAm`W8yWezJYGOvo8MsNi{!yHNAbU=u3atz5D+l;SKQ+g#Gt*PiwB_trAK( zl)oT5nX&%Qy@(OL!mj~l<1z%>|F^R$&`cvaqexW3tdXp4U|g~a2HZsq7_#Tsa*A!B zgWAT~Ijex%t@wbgEVa=+xov`mjn3^b?5;{hg~WW!Hkn)*w|#&fS+#iDP5q}lU3S78mdG_Asu zY0X-XYk3$~3G4$KR$Dc3tlI&JV#(6HXs4#DjD>fHkT?<c(O9k#mS=A9z%ra;8l_ve6`i~b3LZ8~Y$cNh(i2(Pf@EvyWu(H{tBT(SdC ztS{%N1Lwz?9HX#Ei1sH-ui_QcKky2oxs-Nw$H&l+x=(B6vMy~M%9dxCdN0bSB(*)8 zeVdwQsuSU*n%4ZCQkk~y*-#Y`_)qJ;xKs{3TVo88k>a(zo*%_|0<^ZJ!~H%_jM6Ke zL!B6sfHIrbawy7%Max{v1by3vHbre;pwK!C&sab~Z8b*^-Q~3`RqwWHyh#By!ftY^gj&IZZfakaMqid)jM~s3QyhR zhLs<1(4lPj8u9ros9r)Hf3>o1UGDMlFz$Ji^+wOU+~@dr;-YvO{ocUWZzC7K*qYv= zwO^W2K(|k_0vz@nTR!dwXNDZ(pO$yLNp2U6T{C{#9DaJ<#qbwL;F}(8U*VB;VX91{ z{4vf7aTjR%!@AMSbF1iS6Zm+ngqLsKk;!2+dnARF+%0*<_n>(ffs}Wy#9|f097n!n zy95Mnqt!`7FWsq|%pC|CXLcbFb#jIl|DIwGnVlRr_Qu(+Mu%nqvU%0L`alxqvLO(d z!nDDJYb_F`dXVZHgjN-}16z)|0{B{Iq(VDo;rg;v9khNfm=eSehZw} z^|Iw}5Mrxm=tNQm(4V)Z)tU=RFYn3<3+Ku#pizGZidQ!d0Gdmsmd;Y{<48-zZzwoQUBLg7q)#K%zz4G!$Rd@ti4@om=r<9YN zs9wFY=z)~7ZBAxA;p|H`4#>K!$93-gFDAJ@_rz=*K0@-AJEDG#wtKp~{qgqpVDoKA z)%6h8htSaKblVOlnqw@L@KfRFXdu8kr*AB`Ho_;R% z;_HaueTf5OxRv8oBlvNQx}r=Y=xS4z5 zdRt{_pC<36V`WtAHso1CY^IPSiwD&OH!z|YyJP1%6WR7y&UcFIIIuA=Cp1lt(@ofM zpra=cyRs`NKJ05%)JJ|MvRLdkqtkyTQlN4~D|YZsyjR)l5A*krQap^o>;-XYUiy%B zZVkVZE3ue2=;29tKeOf_cf@(7+mnp$58D#)FT~zx*Gsj5%t{BD&BH0t_jW{m>1J73JHd!m)J1WxgY~tlSr0 zo3KH~Q>BgtHC7ZPe_&S-7eBu-|2;&V{j>H+iLMKELw9+5xwv^CRa7?Um)rOM{2|kZ z9r3)0?w^Ps=5V;5&cm(%$j=HL3bQ`%WUzWUXAHWT18DmRA~e`DHu8#HU)ZcI*@PNn z*Yt@Vt{H(hD%;$heoy{d|`Yna-sT=-u|FO^8UoJyJ}M8+%VO**z(Y3UGe&dnpWGA))Irp$TC zT4nC|7xcBEM!kO*XyArj=#)0z!255v6eMQj4|$$;mKmlQ>M6fY%H}6;t?B4;=V;CN zdw54m-ZeNjaGjydf$?g`B9VbiQ1+@fQ_^dgFO?1W*-`MZjUD~M%Ux})B(!otk$SKc ziXo7`NX(n}Dk9?5JR@I=fK0-G<@IytU5$v}0-Y--M8^=Lqlq!m?>D@F$qi4D8y4Q5 zD!n(AA`G_5EVA6Vf|m5o^-|H-sTQ3}9<_cN0=ctDKgwm*iE4R-w`y6Opk;DEBI;V- zJcD2CMsJPzreg<#dL9Me)10Tb7=ox6Z#*T>*d;Fk-1)rVq7aO_l#>WRJr9kDZn!VV zVBLk!f5rSNC&ILl&lH;EwRW9xeMMS>#bYIQ0z!scwYk}l9$jsKpoksz+Tx)}x-P)& z{WV%_EM@v9pX4Pa(LM9JrWOJEF8Lr&_TJc;*ZVIFOY2(;bHKon3xL4P2DS9m7SM|P z7X|*1gOB9`#f!)l8vX=7-ZlWsyb6I_$%I{joF=$gaKda|8EbMpsmpHh^rh-{wP;mE zi)44FP2=JTm(|A}S9UF8C^sf|>*}O|3u&-)G#U6V+$aXI6bu|eC=;Y+E~J;Dx+LP# zNWm8wyxWcVf;nr&LK;mZB;ds&Dy>c^eqZvM#H2MTDXWtbSEq1xyX0qL+nNpCte+UP zhn(CEf%{V>07ll>QFGtt|8af?R(f1B@L||6ALlJ7Fl21_jk;kpX6pB-{EXb0zkQEU zUu-Jo$(!Vo7hbbMUAe-(@aFV;(0-OoX}|vXxH08-ES{e&vHYscWig}#j^is8)8#eG zHAFAMbs&6RY}bGR&N6~I7MVKvprJg$d-@^v7${Z84~<+c z%0Zb@xnjl*J19_Z5~&;=1AUH8P0lwCmIhXi;oBD)6q_6B)SDIdpNI zExC5KOs7#wkiy1R;gVP`BTi(1x%LFahstWalY95ZGl9BbPv9p>#-S8BN5t-W7@*^M z>DX(g&Wv}SIhj9kVtQAW?-!o6pmNNIFV|<$Q9J7ABdg4+>|OPmV_U5A;}+w0cuc_5 zOuJ*VSJ+AV#^x6u3D`PTUQ@oP-mhO4Su#G|?|Y*V3YlD*n(x# z;|MO%WV1(>ZJ8biraj9mmi^V?ZHI!|&J2P1plWPf`6FW7oUN&miY6l8!&cfYicnFMT*oGmwIyh===9X|@`Bha zJbGkio)7cvw>XL7pXzD&e~cL-AfJmrqxV&kF5inm83|{Gh<^DT?2IeI?nU*bPBz=u zMA50Lv5UpRSP>Az5wNKYAwlfcojQ|HxXU+lh6m6ssm1724J4MAWpAo3n>BOBx3e(r z+xM)E#r z6b7|%QuzH%8kbGslhNwKieZm@l5WH)WreE zy^p5&u(*bAqd>J`@A@HKMciktElhB56HyBpVRxq*q9OP;YbwHjs%cBHDhzI`Ilezl zKu>(Y08>aNazEKrU`p*zH9=k!)|A%fgQ4#Im;c7d2IAN-1hyjEVtV#z< zsk7SFy{`S0w-{L3HoJ;q#WR@{LuH+Vt1nq%liuj&W?%8T?^eu@su-T`PkCE`_l;^O zHq7szZz;B1%?qDf0jL=M4Ui{y(_H=Y7Fl0|)b~AzjIh;?%&ywBj`?Njo5i5KhcB7Z~iV zHUmp#e}zyvx_Srn9b&Zr%Tqlmg$ap_I>na8TC|?}2G&}fnjH}3D7G}D%ahTN*;bN< z2)tmW$l1DT$+yr1O-LTCTYwc;7cT`TiNb()o;IZ#Y3$0XW4pOlAagXSZ_^U4*pp6F z#kON=jH%Zk*<4pE-P~g`;i{)iookIPo7a5EcPOG$sG@AH(RE5!%?Vy5({>H+*)%m# zRoyUI-=X`Xzu~ILEul+07EAt@U=yY$s;eR$zf8L#bW5SWC~Y%uyt=k|vJtf|wlB9j zsi;`ORPdz?u_Q!7gdtqub-MD^^%T2pKrh`;-*0oa7?&urvAG2&y03ur?|$`wjdX4D@5`U&BpB!SPhXF_A{JOBX$Mg&Up44C zTr!Kw$4e!-VPT|47jj^}(xc>DkG~=k*d%GwsFg4E-_6z{Fr>Rp^a^tGv^lzeOJ|Oi z2}bGQceH2$(rFCT2Q>{5`KX$P?9Y7c~ZsSJBxZb>y$# zfrzkpU5R2K#ttYw*v;6ablz`nbBeb-Zi=lrQ#_o;dxGKsik4-WXnARVeC?NOk_QuF zS_bS01(|D?X@{Xxr$#HQ8pmrp@Bb}9OR{wJZ*(k&kS68{=_2{RYKm{BB#&yKXbRj_ z5LMDj6oyYExpjPj-0NPWs3oynOlz^b2;6g~DLu!6$y21cxU$q5gp?@n(%jrx<%_T@ zSNemPUfIafclPyG-|Fv|F(n*sm6Kf_U|aT{ofwbxYZKWzwlb~wpiocx5Dm2<=rG_p z6?kzLO{8B^6Fm9*aG*BxLwodA-<=|*Kt!IP*<#+cgI+u7+<>g((}=xzE3P?jQk__w ziSgS})DM$R-O_7X6iKXj8}JvKJwuv$N?_mow*D8jP%EAAlnDE8R2Dq)@^OKRYD0}y zZLF;>!v|pAM+KFa1q0=7`NWXkj!mCtp^J4fwp<@TRjj)`gPLDZB!{y>qJ1BCC~+R?9rHF37=M z5eea+3D>A4yiCDFj{K{Yh}1PY?T#5s9>L5|h)NqoMz9umnbY+s=06Xa*@}%p39++2 z*AXTcrVgc!U8*_4pKScK?boqStc?7*A%k)_zLPdgF#N6g11@SeqmE7a4(*uQv^ahYZYJ7@^Z=BeaV$wLfI1hY;HBx)t)R zqWvRnPo>2U#b`@j02I1YMc8ZnJFNc;~CbU6)1E2hA$hPlYM9MzIX}- zFFKs7d(W^akss8Ld@Q2kQAvC{F*g3{fb+(0=E=EHg4rwj@qa|b;^Xo-(i*TG+QSh) zTgtHqEHOED3Y!8eL8%3Qh0x7TX&!!v=^7(w4uwg^oIGino{I8G< z!mdVv2+L+`3`X_BXH#ZIPqxQkG`O?fh^s}90Y#?RK+5cOhu6loG#+S(U3+9*ZoldwdOEB-1Ro#b|U!=2Qh2gIp?u+)yM#WD^$AWXWw-kN8K6-wvCxJ?%+SI{F z0^7}9h1pr}%P+*#y{^7(%lG9~41PTgx83}{RDW|{4)EOVrX#h_B?B5P(ndHj?=f?Y zz=v0JsOnCo+yQzJzDn^v+{8$2?2gpn1kcAi{R=)!B9mYFOM^QyMzUNf&EI`uh{WVq zEDz|3-T7jHp2Tmcsk^Mg`u=qM118YyP9MRD3!DN!9HXP~d>NU9*r7u7yz4MW4HjGf zN5xC<(D#wE1S0M!E*K+ko+%dvE_>cSd*L=%8!=5=$?)Myb)~abbC4J?Qumza5oexD zOk8cfwLCb(|L1&=HmVY+!+1lKrvLe$pUPnU-!_B=rxv5&$P^^Ef`i&?O5q_ktD_X= zQeC;1f39ym`#e@{p0UaC-@nULhA8PP!0<#5!Td@&+mzkqZMXzQ`$ zk|ljwe3wg9F_SCGb^YjZ{7W>m%SX~BiJ!bNn=yg)Kn+#7B^K0j$jQ>u(tmhO)ykP( zWeuOvVKg!VHDU#EG(;N$_wLN%am192)j&9-aX)cZzY#J?;$nq1qXjG#r9osh^bS4h zSej}w&Y%6^m82g_n(^%WPaM<&=N(~dbO5%5Rewj6{acr z-Q_S(F0}~4S`LZBpFFJ#;}0lu@%bgodh~>Dub8hajg)Vk z-lIW8`hPm%3r-p}Cx;C5o@%K=P(f$cs(82>Cy%Wkyg<;MeWZtT`M26qELs3RO{@?y z_5frIyA3t>b7|>>nySV#?t$|s`t`VOo0x&%A`8Q~zA#?DG&k2?xICc4b=xJ3OfIx1 z!VdruS=0um6v92K12vav3Pu5?I2NR)_wLUYHufOj~{S% zgYEgpTO(>T<^SaNp;MKbq(%8!n_c&|15eO_WBaKpo!e$A>XE_GS!_p|fSLG!u09mz z$s$sI^isc;&>3L+J-6xdgt+gOJvcsWb`QaT-$)NKDFuI*{s%E(7os)Aa$kkd)rNdj z8-M?g+hr?=%~~Z_O?HCDtwRhx@K_U`OU0ielJ7y}EY)mZ@V8CB2bh4M|Fi#(K=993 znETm8sYP7b);k%{Q37RBSxwt$cX#GU35F<~qqs>xTEC2L4PV)PvIUV9OB%4f3wJ6x z%IeOCE@nQd>?v7&-M#XSFUmQ^UYRD)v|6)h3b87tsP0HKzW8~#WR>h~)J@*k4sA$X z6Lv>8=R z3u7A-J^U(_L$ouh+oqw3n8JvfG_#;yW7pJ)7+r>eo{27@n{4)Z>2_A;CJ>B|j0>@3 zR)`T|40}&h&%}UP^2k>w(%9=Y0&`88FhaznX}WDCD7P5_UrfjhwZ!J)VW3T!OorX- zBbx>6-|Rw>NWoKtFr)HH$3ziACQaXKF6*#x+45{&0r8LQHCRCue6Bxf)%YXOk~Lf@ zlgQ9Bn>1S2b5LIMPwm|OqU3t#x+hnmq(JBwZ|UBpzYg* z@2h4v6#JH!l6czqq&R$R_q)~&Ram*Qp2GI|;B2le4?h3cv9Tcfvu`zKser+y^Er$> zQ975B_KBOMqniP;h{suU{g~?0jUk?Omd`%PHo9ek(M###h^O(<4}XQpbN?NO!Kr?L zqwY}PklAUbOGqhVeyRMh`(U+ExvQr}si>%9!xU`7%*}vE2Wta|RwE-go!Bl2!-ZUf z_oHj?4WxK3nu{aiHQqd4=5}{-7PmYHN)|?#t6g9XI7_o~CDev=O$|{t4F%mqX%z|@ zDm{4SFO-x(qnLbXu3=Vj`f2cZ2pXG&LchZodaWE89i%}L`E;HlrW3P38up1xLw=1- zjs0JHzMB2|tNGEtN2Ny$Y!TU|u&%wnxl)SG(VZ3xnpp+`(aJ=-iqM`f;>m{=6l_%Z z?T552CI?Z6Th+eaR_YScODgCRZb|Md9v{F>htnBio`50y?VCwGy}ZpIIasVO_8r9c zy3uFZVm^-{ro;aQa`~@{b9vHo8m&a+vUuewbI}1#;_vi>lDPB+i5qeSJy(%p@w$Y} z(khySQM|yk1f89_DJe4ol&*p(KK|H`2$C|!kNt$6cWh}+UT;}Z7Tv< zv-1pv+4>6u3k7;X|8cVQ>v4*x9}>bttf~!JH{BB+6WV$$&@%W9j$Nm6Td5ZEFMaB@ z-75ldxh!GAp#fo^Pk#PRiOBTdZ&g|}P!1<%bCyn3#NSTzJnDSz@jYOTN#PGvjKCL= zVI8OoJn=_nu+Moi}Z_zSZWtHEbLz-$0kE)_V{8Y8t~@XwSm~E-4YK>DRI$g zlu*oD8CaSH0?bLZ)#V{NabA8amRVi}ep{TDF9LlQ-xahP<rasP(}=vU+Wa9P9W zgpR`*YJavL|CuE9V8%X1F(%LrbVj91Rr&$VS)k}A;ecd?El^|D;7inPNTQ0nFXNMj zEnUEk-|)Wv@34NZQgWju+TsLc2)QSD%#*;54C?GUG!vh5&FZuY`~V$q6imL9`s@c+rzj9c79+&exn?-l*5foPo z1*=xdAE%d(Tzi+qtB>&m5W>rp5)agFE@e)dt@t;?@5kpR&-+W9Nv(B-Bm97x^YfC! zo{34AG_+o4AdqKv@5L**2WEfm%e%{|N6)1ueyD@i>SqN0bP4O(kP`%bs@8J^$*)Lk!1&~;jmLX7Ms!vifC3xa1t&9zUz8iFV zFJo%3z^WK+ii*~{2HKXOWGX)$6RR!97Ka9j$WP;iY<>VG`JoJ}z`aX*4UFy@k;=*a zm00gR?50|2G^)+zqFSk_%t_mRn{yn-xn%k2k6Ue)ec7D+m~RMh%Q1f(d{!w)VIxc? zG{kJNsbODAy7l1#;7Zt61>L}~Yvf}m!W$AiYalyo8rX1)WV`!|A2C8xxf+lJ+6}3N@+DhZwj(e${*vVe7!)})O0RkB(X+@s281q~e6St+euc5EWN$sO=p=n^M zsH@kkONAj`79RfXGXuPL!{R`>-`t+q^oxYTF_m=nF516w%dKl$3i8Wq>k29gj5#U< zl*Vjsi5{e&AvALOY{_9BsSM+YDOy}l8#U#(wi(9t{1 zslJ+>kB7H<(-9p(tiyHL)vDTP!}ax9_m_VL>>cmdW4qlFo-zEr zAMmm^g!`p78_BtP*oQX~z{S{K#mtI=@%DkD(3^h1x5Z(t{Y|Zp^o5~c`Xir|oSc14 zr#F|(vy1UYL&O$>Nxz{q!WKcXvMg)*+V^Cz9O`+2DjjU?;VgbjVeV+CV5JO!%qXL2 z^hU+-27-z|=5Z9>_+w7{0jcNYP`WD79JRY{Xs^Yu1v)yf-f_y6mN(Q?0QVf|W2hte z-D0i@$1QUx8Uv0?I*cq+#aQa98m~O&CFBfprd7{5)zQeY%={ebyB!t5M} z8#pAs+bLmX@w1jzcxxDHlR7Xw5uQm$fdqK5W@LE~(dNuYnR3%f?4O`q^44ll^Zbsc zBn*ikElLs1H<5WIIT9wO;wgBMDoeWcO=MKe5y!rud>H0AlkqbqW9=LJz9Sic$TwTF zq^$L6_)kWNE##JUefW+0PP}-zI~tgp2BZriYJ#Ra(4aOjh854W_P(W&h8?0sHB%EgqFy1? z_^lpZdA5%u5fT)+5Kt0w4qH24p=O})B4;*}NSx}3CfnoB81qf4JyK06u){%wRaIm* zjZ45eY-d-<;t`X9+EpP|h|4(C7DE=;5-ekgC|PgA$O;Xwu9n61;A~}|D4w-Y_`!nunj=dUbFB@Eh@oo0J^Vei&l*vb`! zzBKRz#NLq_NG`3bFQ3>OHANTjlTzgY`nryITH%MK@&N;dM1)d}NWf@7LA}Dh|f`}c~Jv51-@WRQV*t$g7yA;_FxQ!9I z+5jHpn{|F!b32l!h4GoHAg$SyWN;dq{89ZKk&fzw>`g#WF#19BTA59zerQsc+sdmD zidkV7-w4*HjzTGynx{!ceiHO5rIy^vL=ZE0CZE*{3$XPNY4VT;l9#**56eulZTvv` z*f&ybNEYG6(BBvG5mrmI53O#|3bO>-OI3JP-+r| zZ1SOb95Z|wUmTtQM*?yY%b`i3QZvlZJ5*NdwAxx7o-ce-bSqR`y`5MZ$9g)3R>QolDv3oroKNHY_&T0LU#`RDzhAvvKXyi#mvuO zVO4bjT*D zdwwd`-Z1VNds?P3dMrwC9?CeiF998YM zl?J>X1(vOIt+2Q3LDczV3kJm!NyJOs{I+VU$Od~qc%8ArRkSRBn(=&045TFI)0i~& z(z{W!UblW-V@yCc<(TR-OsS_jAoITBaC{NMM|6Y-&n7MwLa`iuY82fS^Ahe9xS-f- z5H!^r?0Evn8QJP>P8eoDQlNfyjRw0UN3zRgh1 z0_XQs)`mqoDX%>5QQKpN>W{Y^@6SMWetn3UE22eL=sB7cw5byN@+4*+{ks3h}4U`oI zNbE1wKcRdSp(ZzX;Sg-$=FEltC%;pi^WzF zo99U!0XYd)$+EK+k=CA*3;YH-)23G+BBky0MtVnVr9(2)LTBsm`CYdBfY`KPw#8C> zwa~QW+;I^!0X^oF3hi^y(mEh;H&{K!B)9yj%7PoEbUZ(s437;Q+O|4!kqk})RaM|D zDRj=>gk^Gse84xDJV-XJ4&W$AdjCmRF8+T;^|ENI)(vZd$ifvzqn1Ptyu0u&@O2a}FJ`P? zoz38a*m}8m^wEV!6y*&>ao68ie@JLC*$-|>Es^V8R@1V;#&#-wv;sV@2vFoXw}Uf< zMjSU1fZY7=3-Y2Qv-AD`UI}r1f_^{6Z(+5z7%UXB_}I$Vi_VjnR5=P^qSFXBAI2%5 z1oPD9A8TtxxqqmV&sYCB?tjSnxP3#U<{_JD5=bkHEtOvr;S)(HXvI*pY(B<202&0$ zo+tBKIJ{Paf>JWa>AvFVLlkIjLNkXgwpdk&qDIGMw*yKn)@TK-tvnUh*?A(PbKodx z^Ga^{I zMb9frM}JU@iaSe5GikU(cvxraQPPtC(leSj{MNqf8u>z!PMfqDSdw1CpLV)%$(F5!v35O%6_YSeqcxaZ#uC1<{ zdAUajl1(gT5rV_XT-|*brwU?bE~4>i#c7X!c>gF51IyYcY3~fiTqDPo@=J+aWhKu5 zs%FcmbdDmwu&7?>cu-0RLl*7IW@uZ4`~il5(kuO8&6?W^NK)Xl{5-`$JJSL zayZs|jR>U*{2ZVO@SeSNt}=^Ig1&l@82xV$qtdG-*Ha@~gI|owjpIqc>XFiyaKM?z zk+*&euw`3YOWMV$fd!{NxS%v5$4kR$CGBY0uEVN zG%fArI?q?({J2H=+Whq-=AA@`ZS1xa?TvaTiFAQPzF6Mva9TQ@HNx`8-XFg@%&2i< z7ZS-k9y}O5={ULkCs#4K2$B6q6qq?oE{b%(taAjqr5ku=E=ysZ?1=a*;2?1&5?_~C z07XE$ztrtvH-a^;kM!i3xd;b>&4wLzxjM+Gqj~hL7!415zqGAvi|KhBF za9zw^?oR?_C+q;vC=iP7H)aZq1%*{Smw-?(V47!tlzgQU$mm_Le8MT~?-r_ft@jE? zanq=~gO(97$6Re9DcP@48y&*`@`k$%kCS7wOTyXwb^cVYu=qqcX-bVrn6ThjZ zf9lFsB*(|p{$%NiSE@(|TKA2jUzH9W*`IP%`8fZ7%wF@uz(cFox-2g|nsaXFDlljj z1hN+wZx!MO$_?x2Dulp51P5+*C=h~AiZ`JacSim&w~CaKRJ^LaY{hILiGhy%t`kk# zlt1Ji+LH5$>9o{c9f==bE@`_eb~zKao}S5W4)d_? zH;^};JsVeA`D+6x-Y<>SL(WWQ@-cB?hTgo#;hDivVX&>|)&|Jyapx;G7AkcX-KBzf z5;^VN&N4Y{3aK?u%6Oib_B*sL6^3v|h*YpPFhW}Ak|{++C7m}GRr`6Pt4Bu0)^&7_ ztr@d(`&-01u1nx4Ef;use4eMGl<(o8vUp1k^Kk0n0XWV=gBqpqp@mJsC-(W=sfO^B zp5nr=2m{}2ZD7>Rr*+yQ3c$a2zJVPlNw!BF9+*Y{D}(1nnXOSQ+}xJpiOT$;-K3ZW z#M_hpJ>On=d8utmUY^j&!zT%sPx|=$?Tj0XnZy9!+EG+i)c)co@NNI~)c74cg+_(e z9Pj`aB!ldpmDFLj%=R}wPx0h6Mssdh+N8(B*T4j6Z?7pxBdEc`!&fHp*UclBqYGkc zR&>6gPU3T`b4?nPzn-3C@RdbfnDW>?3372SB6&2@3D2NQL(CAN&|Xo>b@MU}kLmI* z3y|8ju*ep~e?PJ#Js%U7>;o5gQXr*M+yVE<*y_&M0~tl$6j<3!mcUsdN;EdMG{(*o zP4GQuO#h5+!bOPF`bzCH4dxN&UV{h(&)q`P=+|OUQU#uBtifruwOE>wL?Frd!YoUB zpc^T}VA~Phfp()bJME>@*1#CcbvEMPbVnjp4I=h{%USsi64e%ITcqR77xN4o92>%{ z%n*Tzmrw7!a;1}(3N5X4O6pp&GxmNU{tVNnNYw?_;=aHV@xsv$2d{_fpbXtu34;Y_47i3MfXk|pQ zrW7TS)*%bIQa;U!X@(@C-e2{l>$O}(tJz8X%30vDh9fq;uYao-0mi6`o5v92F5!1l zcLy=1Pxma*WqMv1sYws>Y6v zl?&%{DneHI5&YB;y2K>uqW!^=2b0gjx=8U&lxZxGDn=2!xh>!0j@8X ztj3G2I$PQ=ZyEDx>Z~^u7WaN(CY$*679_?0#iqjtLy63&p}Yi3@pvWFR#Mn!jlFH;3uG>X(N6c-2*_-S$c`PpR8JL?WDC^w<6 zG&=P$r>uA9v8=8S>6!zi1syjUZ}g^JT9Y^M=DYo_c7otvNlXyDS)wmlm zkyA-VHNv=qv>N*LvuvCGfce0tVv?VK*Kv2yd{23=4Wgd&4HF(nGhK*}jU}p&ZAlJo zy+`&IZxpzV3cJ6u7Wr%qtLkZ3tr48Y<`FXaQ1Z=7GrFScudBWu+MTy9bkuby|IpCJ z;C(na``-PYd#Aml%^yo*?T~cx?&n}?`k%jMY=R66q#EZ$$6!CHetN%07KY?in8n3y zX@WU24#jcQe-;~KF9g-#QgUFgk-BJij!y|0KtewW

TIWHPC<_9>em(Cvlhuf-BD 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 literal 0 HcmV?d00001 diff --git a/FiraSans-Regular.woff2 b/FiraSans-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e766e06ccb0d457fcdc8d4428efb796c7772a497 GIT binary patch literal 129188 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

)Thpg9J)x+@B(n?maf9&#`PQNHtKX<@|CQ`> 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 N#!G)s;j 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 (}T-D1^GP<^82Uij;8#+ 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

sGP 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Ɋz2 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 literal 0 HcmV?d00001 diff --git a/SourceCodePro-Regular.woff b/SourceCodePro-Regular.woff deleted file mode 100644 index 5576670903aea90041f214624c8dd1176fdf6081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55472 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 N>i-Ak^d1HP005RYhx7md diff --git a/SourceCodePro-Semibold.ttf.woff b/SourceCodePro-Semibold.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..61bc67b80252dc41fef75b08604adc1a09c34761 GIT binary patch literal 68080 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 Dg^bl@ literal 0 HcmV?d00001 diff --git a/SourceCodePro-Semibold.woff b/SourceCodePro-Semibold.woff deleted file mode 100644 index ca972a11dc428209dd66212e382b884f168e83f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55360 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

d?~=$y_z?$}zMRxO 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

-nf}~4k^lgCB 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 d&xU0F2O@Pp9zf@HhMqK>r}n002Tsb2$J2 diff --git a/SourceSerif4-Bold.ttf.woff b/SourceSerif4-Bold.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..8ad41888e6e3f9f4439052ae6b14ece2cdfcd7cb GIT binary patch literal 110552 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Ǭo4eGH4D`T+wvKSl&vQ(IAe(SEgBDo2!Z;T6&0B*qr?tsA~aa3@8#<#a`f(q#Fbyjml24PADEw=~U zX4*M^F!1@aL3A2<>S@ln3>qbx`I-q9z$0#}XgAj2gx-OWCWn{1OTpam=XL)?t4nab zEVBQ1GQ*EQ6;ip(m!oxD_L#Nn%$6cGZ07A2>&#bT4ZQD2`CNAv#Y?-T0}-~tv9#G< zd(HTUUc2?Y>rXqi?(5H+fJA;&e4ooX-i@F|RQG=uYU!?o9OgsGR9bPSo>#bZ(W=M$ z921Cv2vqPNprDMyP;?+)@Xz;ll%JU>8E9BO(Ni;1G16B31{IX&l@?XzmK0XxmlZo0 zTbbFKT3gtgd^fiP*g$fn9PFHI9qpZg4|h+uk7*yUVbS@}prD}s2EK|2|K|tS!g9S* zBVRMi3zdlb`+S~8h8rnA@Nhm~s}njX6or`Gdb9~Cp-3Tv-DbQEE-INxuf}?;1vR6= zcBRI0p#vr?mPEkmXtWtQrBc7u>3F;y;b*p>_vO)8D|$|c&-3N6vgkKiZAo4)%cw(f$IW;2~RPJeQY(;KtTz5#H?0A1*I zT94fKc4h+#29;wGLjsj^6_F~2W0?Q|oRKGgiRSE;-Hxdrb!IHD8@9G7uOIg!wyhho z(6g-{a}zkJ8?pC3sh{veAaNZuks$$&I?-mj4u7{S$OMji;_JH(nQQ3-$AG-6t|NBe z-B*DVzUYECg8)JuWx?A~7glx1<1;T`)pjR+Mo!B^nTZx`3iyDOpvXSQH8aLG!&E!Q zz94wb{Htz~GK#r|%iT+x?a?T5ENv{pSC2iTta;OI_dG7c<@qeZnK%90pXXQJqb#dw zcVx0xq@L~Qx8vAajvU9#QuU;=uS)f(zz(Pr2m{9nu z1XOI4RO}r2Yz+DA`~Wr@0DIEd{J|{?OM@wK0|3Fz6yFVierHOq1m+swWEuwxvTRba zfd6@I7d&S7f z*E{$yr^QhleVXmBuV zj<{-5aT-^Qf(c%PkKg?9UREqsJp8-C8@z84trqlqQ##r&1N)oz&k{IAf8cUU!JWka z)VyoQUi;2g5AmO`j8>C+oEoiiQ4H!DH1Cel=5@gahmG!U=MEhHU=q?jqPrWO3R+D*7v7{?bZ$}19zTu1@6^} zxhMW_FC*-;zp~7z+>&FKqRA`bXR0($T>@zQ}8j z^7KgCe(TX*Q@&7SkGym_+wr5((Jj8%D38+gVcRaE(QYihAMzeW=?u0*>7&E(d=Voa zXDC|LxX+|cxGOu{wkZoW66=4JJh5AMm`{=$Yh>2D3_bCm3#8vpYl=>t8@rdH@=Ea{|A-IO4$RHM06qvRi}sWq4z?3wBGPnM4n zsPR}b4ScKo9W+Ynn&=rc&S5kuvxihPoGB)sCSpa63|nE|^*e?Mr!FBR=jcBSFen{VZA=0EX|(&LlXlm+twwTdH2clC*Ii4(m+bLK*Z z2f3@tXy?S@54a_zMU(jYzkF*>$~ef?ZaT>6RgpuwNH#+6EqAP(Y+~C z(F5L0H4&>RBybEMDVFf>XM>YS?Pnku(Z@5EzM1VOnYSQivJm3wRpl{JD>rlD8L)0J zlP@>1Y3S2!utegij@~y$nAn#3%(@#By<6cEpyLy+{O6bQHR=2`!0QL;O@y$CJL*}G{zMPmo%d93VGbKU+KNF{jBP)!@uiD@3Y?Jsx$cEN?VFB8{HL-8IR zg?cos)km6H_uCiXy2B5$x%_Y6Kb7Nj11X$uYAj#VIu<-C7U1n>E$pT=Cu~~XtWxf*I?;}*V-G;F zhfQ6X<^hi7-@ksUG>;LLB`ht_$LNz&(Y;yF!u9!zyUSn{!l22mp@ll9&g>Z`1)SSF zf6#Tn(0H{-YISed zRwqCtfUyZHLhvly48t|eQCM)n06qX3ZG0nVAId&}IQ%B(s0unSvFZydq7Xul*q{V* zfK#*#+VP*t34sgRdZcZJvwdi?V2M%XLgpH>FJfKvVqF#Uy}H%7Bm{gP&}#mLZb0de z04aDKsd~p&e-NDA1E@V;#dq5J!ybR2GKry$JV2lA4*VmieV`ZVvo(NJvXil?U`NxI zKOUL}O(@HiUjt~Jsdyzv1GbJClRl~K*N(eS$)j%biAI8_YX zu5LO>6hJxL=-*%7g)>4xS7e3sG54kM441-H$H;9WTVr6uwV!gVTq=!7izvqh|ygB*qMX& ab?Uk+hzxPzi}D9BiGnj^LkR`_PW}%h3&oXHg#bVVA^-r=3;;l$ z?uz$5BCpKA{KNB84xsY`1O2fKUt?QC2LJ#{0{}pl1OO;^($4|XL%|Cp&KOh8E1wyqmv^50)#(vrc5(NN2 z8*$nONITd&y8r-_rvLzg(T^O^yyfQX|Ls#yAaG-^&Q*N`o<{%($PfLeR~SKg{~I$r zF?}O{{ef%*xdi|NKz{H);YSysuwM;7ZP@#v_x;dM0ZZRQ|4aReKt(-(j15c-3>-~0 z#{0(Or~2Rzi9pQ2%>YCq*ZLFnUIH1hxWhkpmFMD=@W1y^yXaT6 zexs&bsXvG4?rk^rhI}g{CHh{b{1VGDnq+4_{tjr^p*}VdHuU?l?eN@eWgO}7+(tj{ zFQFN)2vlW&6S(4smVAS~eAhvi23OeziUDTvgEF7> z-uvFJwDH0CW3Eruh}DxeCEj9S(} zURflmr7sQ(`OGJbXRa{vK7P>qb)J>@tf{?sVVV7|7_+%@e%@r&8RB+f*RbW|>iXJh z<0~T-QA4${zKp!lL7{ScG1g z>84GlYjlZZ+~ekkH{frS3r~)3Q`c^2bsD-haqWQCF>qyljv0Nt$b>mnQATsrrNmdb z2|3;^+fkbA9p%JJ^_+xbiqXlwzVkT$f!RA}GhEDo{9LQ`ZkZXcqF5Kelz!wttK;7r z+8Bmz6maubV`>g~asYL*pK|gq@n!1zP|Fe&W&jAIj=crE*D3FQnbxV9MS;CQwsGDb z%Ab(9f53cw7%xnZ-PYEjBlWm5=Wy?k&vR7_X`Cz4myhrbZ7f*(?W|of8O|JRY6OVq;42lGIy=E)~ zBi0ypHCwxU%Z=zkD&X@yZndiJ$R|B}RifkO| zo@Lt>q@PS^1#F@9dTPi`gYw}ad-(c>XwNYUaQKHYmUIbWa_Qlrl)G(C9|hJnJ_4C8 zy~#2w0h8U>@ej)UweLvp!QqLlPBZJ4RdYPnIZ9i?CbBbdNWzRDbP9>3Q}V{WDjUTa zVlSOmH*T#_zUs9U^|cqw;%!x0^GdRuNggu7zOaGvB+tdYMQ(l(JTpckCj7Nw6;@UX z_5Hqj0y$T}1jkQi9l?S~gZiS4Hx%Ro~?1Z&BqTv61e<79q7EoeAb^e6a8-CtYr|^qB@?a`9 zWFj}hei9H~9O$vc^A*TaOMKcZu^oKBML!;H-t?vCi$rKcciv%qWZYREWMMt2^bkAd zIdj|pGKyz#uf;P%pUJEmRsL(gl|e8aaqH76)V<#}A%A|8r|dnQtp9d|ovkzQr7jyJ z>?>(on-=s@ElcdYp*QV2iT$10;sW;mZg_crbh#$I*3^W3uEunN^**)Ig2uEX`|(A0 zQioJI`F?woY=4le*h8Z%?a$QvX;Swp-QgGTCZ`@XD^|_1DCvuIB>Y8qOhUI^#~jt0 z6Dy9Dl#rR-qwY5HXxMGp@;QzDn&Cd?c&4+Ji!+grZ`Wx4*Mr$k|6R-~QKj*&FK^5q zW9{9MXTkBQx5RkNT@iO8Bl@U~I>z|5#P?ukp?)&YMz<8%(@y=y#C~5w=7`ffr!j0T ztDxqTdVGaMN&VM~{R>G&YT+J3{zD`-Lpe*<2B7tll^>zdtXXr%h$(YYJ6Kx z%4?oY%}tu$LTdc5yX~aD4E71Re_Up${hCH?ZYCL?3T8V(%B?(88^a#^_6b9xKiv)G zxR`$Fl{4OSBu;L^=Rxzkp4YUVQ1SID`ka66Qwj3tRt}p4-o-oqy_{;*s{T3L&id%! z*Ib)|{$y6m5{|F7Lr;{gg1v|~(x+i{r19aUIQ|z7=E~##x_8R+%5yS>eD$|X7kBop zFP!$+v%R-J{}rF<1WU@IQlt1k%MvLo)g$c|=o83q^n0z)jLQk(wKxRBPhT`w7ypz* zeNqm&dF;(-k~yrzFDR)qQiz{X+5;#$6~x8(3OnT4Z>J8=)#h+gvh-~Azr&<=>DAAT zw_jFw8`g%}b%&<$s@A?D?|Bwj(7zzJ~ZaY=jNdf*o z&?HpA5HZ+bP*7)3*oRaA5}6nYnFK147%PzkOox>1jBGNnszkOW;7OeG(u-IhG#U&XEY9&lJb@`XD}@Z5Ltk2Rmfy!z$dqh zZnw{Vy$`>=4|2c^f4~GJoDrcH+CW=X&s^02Ugb;(;eZGcMaE*%8XQGOZTFO{a2u|U zKZ?Q`h`mZ^ewdD%P=s7ib5yMpAGNMGEy-|Jv-B^Q?lu1TusJ(Tg0m##CH2MwLWBr) zh{wi+#xFl_=JmJytIX4cYUqKtCQZ~!rhR)V4rvjj{#}ZV5E84PA*(RS!w3LYgkQvn zJ^&JTz!BHf&XY3ksDdXc?M_E;491f#&R{;~yM!-k^^m31Sk-dELj*k5PTf_I{SfHN{=k zb;)JPamks@k?=J5#?-B1!H*P9x zwf6C0#>El!*Ye9Jz~)epDOuFHdB~yKgdW`>Enp;NvtQmLsE%~1j^{cR#7QJ}!n1>N zCrZAcKXyb08~xv}zT02@x4)!GTw?5&b-muy@eLExc}jE6%>PdLG|k(vZ%p|)uV%C6 zWz+ zHL$F?Qb@=c;j~5B9S1tNO0)q3$2UGsA7&GlEm;cl-q>UL)6` z!>HTUhV_olJF0&I4Zofwhz^aP=}=2yZ^q42&Y!n0sjMn_pdG`ogC3F|iXQQvupWq> z_a5&a?w*Z+o6eg|d;VRRr?V7=9VLAheGou6-_-<)@93I2cXgB=E-!1RtII+8hvIg* zj3QQ%j$%YW9{;=NsC?cR>t5ChU{ngQ0dxuE00@(8pG;E+q-3G1IhpsWl+08lUj)4Pw`Ic=x2CXS5W+xxtHjPM8G>vSl>AXlxyrkWY58Zk?n!cR?P5DtVnu?IHv zroSQ&@TGS7Di83i`s27r&y^Ii1bC^>7xFoUXCou#enZVAM$9JP&gEduW?0UKSk9%K z&4$@M7>Pw2(8C&`!y2l=n%PC0=tUdx9gkR`_i3R2#Y7+cg+5G*KBAKPS0;6UHPsAE z=Y*NoKz7nlmDYsrmu!TrO$?n)(3DLS-eoxNWu)$9bk1dP&}9tBWe5W&90ez+IVW)0 zFVr$lSo2@F`p)2f2B1A7{v7~5dLdSfMhLYACcb0P8+w21goqdh$6H1+3 z3!Otu7h^9ObF51<3|u1uENWxZM45yvCz4Wo{Rv}Fq5;!vnN*HDIX+62MT`33rA2Ig zVb+Aw`D8A+5o=ex61L{j<@ru6eF#h2nlj#&w5Mf0E)8!B@vGvTmMFI+yLH|7bHG*E zr)&N-$0CT>L%t%fNi;sYpw}Sig(8Z0Tt>Us=HLPfc~34Y)I&1V+yZ$)E>pxqwPf{) z3^H#WhKy2@3`6Fj*I4oF1bK;{iPG5!d5fRX{An3^ji1^4*$H{~L&_JkKBBUUhJdO_;4s+|^}3_hqQ> zW$eIZ7|CUvJtvI5BUjI!%*UvN&YqDu&Uul(L8kIihCaQ zzXo1?W}bol^7Ti{e1_8k{hjLu6Qc`DA#c*18YLUY5UB{kOpB`%(HiFuzX+lp0as#} zpb8#OJL`5kRsVNw{XZ-0ZeAA7lZlu#$zd`ViY-g``+VV-%H@vdo z+b6&0QOAc$sZus1l&Nm0WNZHHu*Tfw&Nh#O&AROB&u>UL6H>J0&FPHWmUX0Th}~1R z1s$ty<7CQr6tnVM^%ayl^;^;%8O^Vchvd5^ZwOydV+1cNU$fQ3;fIIhj)xR?C&LtX zr@)B5Q?|uTv)~`o+@R?K%#b)z>6PqQb*nc$Iz>7(Tq>MyPnnPSW{<|n@@bN-h1IEV zD0E9UfjYH3d(W_skmp*)eTy%WaYR>W+Oq8W#O%rnvy#1qIcR$6w+eN9I#oHv+o+yn z?9}PWwhDB#JC!|qPw5?GHlaJ!J?+o&G?5q_LQ6^GebBE+` zN|a|p%9$n-Ma4L>)`=uJiM6cVl2I~JUJH}typ5D+!cD|D%!FNuJ*;74!P!!83p(U5 zPBdrY_vw?PRVIKb^G4#{M55+^v54PNp$kIf2+%ZGvQg>4l$9o+bY^#j?Nq_YQuqsr zX6#Z_8B)?PGFW6NmYT}AN69ipN3vKd3XRcftgZ@@V@_IYi=t>`G?uE$2usP;`Af3C ziwcdY%d9bq(qm#;8?54ZWEYmY3#gCD)kTl8D69&NG3>0ia}r}}>#NOzEMyoK&Md%m z$(KcRvK-AyPT{TW-Lqn2e(TFF;@o5q7TyaWc*(dwT_EqGYp%5aC-LmzH&s-W6#Rm8DF;0br(9k7S9|3lWVhMdZf9cAL+DvlmQ?JV zb}2zFrKMnAX8KF13F)WZ*GvLavQ0kFxV0EaicJ|)%1W%6sveh?o~N^=>(NxfV+u!H zEsJhLzsrc&0)h4vq7BPHJxZ6zpE#E|&&cj$sMuY~?R`wSJ*?Uc`F6XW{m|FwtYdDw zjOTXSp530a2naI(er5r259M=^*Z60lTnGOm$8W-6qI9U=yX2TckTMb|cm<&3%}^vi zuh0T0VL?Qw2sw2kAty0mOvLX8a>Sfjtk2nzhhak4VE`->8PnoJKV!52RW$Pv<8bnb zhBDHD3`X>bkIA4AtvFFNqiMsuN*{H#sCD&EtMT6zp&(>va0eY(hoKhmDP$?K|602A zVJ%>(%W~*&Y&kAG^w}<;Jj*g95dQwRsV782NY@rN>ry^(b>AF#*ESnEEDUjEUxF7S zOmSpiloJ!@IKCq{l0}%F|AFUH2o*^+z9U(dX^>v}q3hBK6^k{#BWs?Cm|ph5>(T=i z0XDuPjghIKQSjmGQUVpjHohajlF6u1_5tG34HX49&M(1{>9AV(A?#8G6^A#@FXNsG zxeAebMo<7DBa+RQ;2`%pa_WhKm6q(Et;eqDAo@yis)~ZPlI)+T$1(R$;I-^j7zIy0 z**}wyjp?7vtNE!jN&v?=zw}O~fRDl#=iA%|O+UVe7*h}-^i7Yx?fv@y*z=#OTHTL{ zpIDGdq%d#fH}vO-%2pO)$y66|&O~@!qq8)Gvb9iz!n0t4%CUfg(zU>X(zVn~HhwNf zBYP-KB5lrJAZ;$iA$#D6x(m^udMkMed!T8Uf3UudvtVryW9{@X!IrM(jG@C1B1g2A zLWvYFvK;i9Z{9yEPk$^t8~U~fZ`fun@&L~it!9{_&W$)mybyPeG%xKK44vKF=d{Fc zC}6Ggu*;OU!JJ~q4O2tZ7NLn;$xj(XUl`wKvqWnkYp(R5(~`A8tD)ZxSVq*AwT|Q{ zju~X19p0z2Kxv3+uJDjvm%U`YqUQ^KLgW_ojzlQ#9+aEg-VZuMY`AwRe}SYnTRD@s zg>tF(aOM)Vfy*IJjg!Oh7B>$+Dq|ViUeGk+JhN#?bBWck<5It5%b`dOo5t`K#t1(u zff?GK7d7fQHEK|IiO?|XRJml*B~MME$MBX?4>v8M8OohgHCj8fYB+I;(LnE1yM)rE zP>ZU?_)f4xtdix3{1)MeSSrXG@-NjMtemge-FS~_#Py*Y(%z$aG12 zL2zl)VCxkB(C$>PCfTCMO~1yt5I_j0D1;a)ofqCOIWugqddDK zkq=MHrx+q%P~ImyvuvPxi1wiJQnMlErO?aH#mEw52u~}*7&4oa-bXt%ZCHDV^bqw@ zwSn&@*Nf1@$da@VPb=dXdRoxl=RLJ;0C|Y@koQu*MC_*6&f3P{79t3LEm5Nb`$G6s{Jo(6uPUQAzc-?{AOSJsGg1u6 zU%H5>Q!`x1SRy>X;V8(3HTK0fQ-yC-FiA39UYU^Wom@5!*6b_RED>RTK?m7v?$789 zFNiHU5s)o?0iJEh(zsgBZ*u-viYROu1xnfm?2znUh_e>=9@){JkfDXUggEDD{&$IKyL&99xxx$t|jeMUtvl4Sr*3Zk2ewt{a2U-j9Y{Lx{u zV{{K{djaJZG7xyTor2F}iiw%(&Naz1@z7eH*8DYX8{E z**jCZY++$xr`ku&{-QZ%P4&|ANfp8ow5)bver@lMBh)j2;6DH*2P^>K^0Vca#(u?S znOXcC^H90=|LlM3vz|;JOf*zB04o5XDgZJI{s0i}17(D$259#IIe>2hssX$HjoUA_1!Pb$fXYd*^=|QsB1osSGJyDT~QsOr3AcEFeoHZ!yrYAr1N~n14Yr8OJn*Urc6xf zn3!R`%)sLUGRop?^7-**K3mzY1?~s1&%cR{(X>tUclU9I8!S9n+iW#diOZn9kkTl3cz&&}#<6qh@(N6jwiobK5OwP$XwX&vI5H+sn{eOX7k zPkJw%JL?3e3{NZXU7rhIZO}v1ztFy%K@kA)0|Gy8@BipLhMd#%`BHlQ`2Q{J{LQ>J z%(YafDqoue*NtqupTyp!_7h->5vj!25eW_F10TqQ$9^?t+YpwGv1F#B7bA5>+7))4 z5_v`H6}Fv{yyg0t-)cIg=9-$nYI3S&wHVO1E+@`1uinjN4y})Q4XZ7e+E84wUBX@F zT;5-GT{7U3;ZEWD;%4EFcyMh8ba`;_Mb4aPzp{mcP!ZCg{+?F=I~QUh1Rw(NxP%EX zp$`nWXaiE}q1*j`v-$!j6E6oTK`L}FLM=Ay9kaKbLeRm1Y(~uJKEWS zs&?SY10cUo_Twtc9?Bs)Aw6+b=fZHubEa@zamu<@y@tu%&#gEAebUSk*cQxjj(5U) zBE9GQ9{YO#2KNpAohDG*7vC3UaF&m+gY_w4E zgB~6er;GNZ=($7xtbbAPMgi%B=;3ht0qunN;RwtTla$iZ^eLA_;uEh+6wRq&S7WfdnD{ah8h-xkn# z!0ThcfBs)sYqH(go@%w_){pMARLZKjn*NVUyT82=-k>T$*#h4LPzpK_VQhn^1?2M) z@=+~-xqjyw5MqLn2XPuu^#!7q2ZBKoLOU7Yt-`|xB<*s3Fz66mgTw`4^s#$z`+)X< z`U{K`#>8Kb;)(=Si_sVK7Rt`rojSNsSqZM>bI%E%T0TI(q0HnDgm`XM=V}{A-F4Pz075Q_T+8)^+>k;7*;t^DwZW296)j@Ad zFIr4>2BPVzNsyuHCZs3ECy1Yrr>3F=s}_!iHRNpSd?a+l{^Z^Y!5y5_H*HAdhSwFv zJFI7P(@?i+Us*vNbzXjsq#jW<#CE*ypxZvTiE2k*cIf5=@yh>VA6nCb7#*gL4^uQ(o zy8-tOHv)G8w-U1zZFgY0;Gn$uu)VoFndzRTuO+4Z)t24jR^M5jXR~E%m9^Ho@iewQ zCbwD=n+m@w$PNGN+X>!1)?LosE2l0ePd7+MZUxF6%N?z4!*|Jdg=NeI3Kt+C^u*q#5+V7#6m%y zkblT{uvIWm!OY&Aq40~!i*>Q}p-i);3PCrbHC~ZX*a6!?#-M)$bA-;mNTYD0_k8XH znetf5Sj<@WSkhQjg;<4JgG~*`Ty}rX@aG195*g8tfkUwldq*pre+IFjfk6%8U4ZzN7ADeYgre)X(; zMQ>SpO!C#Pm|P)Y;`Q@*w9};(``+Tn!2AcoAy!@USHcr>EEKGsG_)a6qkf|rdp;JQ zO%OAQPP$r5I5NbkLnRtC$Of@HlmS7>+PjSb-gcGQ$*c0U+O2lO@cx{0Yjf1b#L(d& zW3Rf|*c!pl(WkYp)q=_P;yQDB&?VpHTIZhsz3w^=fui!0@afvay&x2bw)F{`FP0xv z(coNwREb*6F+7+gs6>L%pwCvV3(qWtG-1&~!1UO}|E2(E#ApGlmWJZ#dMEL8ZE33H z@>WmYW~}`-GvtgrcKO$hY*}@RuDO^QeKO_ULR%IuCjEUk#2uS4u+aqrVIlYjh)7kt z%mX3Vq_cS#wz&P;rcZ&ay{U^Ssmq!a0V%tKmEDYP*F9eG+fz;@UN`1IKz14Qy~iP~ ziNfzn$-)m<=a;<+HL>)=UOeI#$Lm}H;vB;3{zo@Fg_0o)Wrng~OFr+`j{6Y2^*7ZR z8orJ3lEEF&18#nDzOfvHFJ(Q@-sw+4!UUmyyw)6*d$cPXdG3GOVa+GgXNK|t%+VW_ z190{5j+kw_K^DbDkclev(u!mDgNFWnN<(k(JM|^ZNe9$@nvTzPHW4cbE~bg7rlimD z0-~{{%-l3lC!vA1d)Fks>^rh$F6-m9O+`r~v&Z1U-N%)LA8oGSkKLCZl_834xbm*(;g2Z9#^K9dkk5k-2!sY`d>8 zp%sCZI-66I{TOFgybr4ux6)-LbRBr6^n74C*qqlGq}(F3*u2)PNxk3IlCVQ(F7&-T4+6@Kd7M{(qq zRc=UB>=0PAf=cUa#1aK2lWkeg<0A7oG$WnMRA-1I=7F}|Ox{qW`(uIBt@G)hY*d z?tT^B9de+BFh63=Mmr_Tsa)c>k0JhxW$*_2>I=8$#_V`!8x+BB34KIN(tso1?nDnH=-7oE0VUIfe`$UtCfZuu1<3cgy?hubc ztm0KODB&5@w8z?hKa5BpT6)4~V9Pfi zA!|rDnd(wDGJ3TAcW&^&GS$$<{Xhx5tdG@1=m5DG_2%@T3by`XuEyl5Vc0B!taV*L zSphvFf(~DHcL*i$LR#dJQy4FC$uEWn39P(`tN9V-EHSvVX38}hZ>!rg(3PSF=wY~| zGbQ!7?nZaQ?iKHevd17%dLr<`PhTNRE^F6qmq;ba6b+JG>`U~{6DRoa0vsu4#7ZO8 zKRu|VT$79vZeb3Y81_Lyt#MXg=&}UjJ2^lzzSqv`lx`5_wT`Br(3sZHPnR2vY6{mH zqk@Ucyh8NsTK9JfeF(6>C~ve27Qw@0pXO>*(KzYhW~5VlKo+ak*Fs(Ij1IQ1rW?(R zjF95$#|&%<9X%k*nJo^#-~O#ZD=~pxyrHEp*exFZ_F zaBGJvwtp}mj;A$_!7#aa7pWqN;5y*s&s2j!!-#9hj@|`zG`aVlAIh8{C1i_VJi;^A ziu}bJiLWZuI`B*8Zn(5*MQP7RPAT&Wq&Ock)aM&20EBp-K&$OVZc4bwF!wm3i+&-- z@2g$Q!!F7UCupi|l02bE5Wf&iZh&aLyE;b2q`Nk^P~&ObB`3SdehME0L~Y&*lUQIyb?4Be+xs8w zT-_A-)M1qeO^$86jq;BHUryusEveb?tty{eKIB`E%tiP2docc2PG=tK4ZYs=4i+mK z>n~uW{pTP|&Rw9G^wth6ivnRGKa-Es_d8RW=0^dul?E6MIcjj#g|4LSgP66!(^#Wg zjbGl`l;({=YI3XaJxI0k=6Kz{c5$<`4A+;uts0XhKE}phouH~n9Qjn6ouxoK!}^2y zw((caP+QV9{y}ViqDs>&8r+-D4qeVGB0&2yd`s@Y?XCW1K{G_^lIqRX3|mR#2t* z$}`cF_zvxl8|)0qX?Of8n6ET$@Fpa{J5W43lWJ^l(V#Ua$CFtdJi*&Dv@A%Le>P#| zTEAds{NuTjXz$0Pu7}Gv|6$6!lVj`)AA=4s2jWD(RHnI9Mv@aktzCbbB!VY3s(vW? z+h(jlG{D?FVYFG`6^=iJC(YrK*__#^C1nRevjhU)mMUXq5w*rk)?q;-s#lny<*o~q^BQ~6gYmSP2*O8JTq>Q6;bT#C8?w{h zyGI$zAa}L}_41ch3^0EB!tYvdX6n4Vt3So1EE}LlvDj08lsVe7UaZZwXS1f*Q&jA| zUEr7Xuy4S+j(l_n#EqGZ)VY!3J3cYbbNd(_b)V`tHA$hkqm#b1dqWjw2s_3WPV{uB=@ z<4S`{Zi0uD#uKO!Vy}W(aMxxrn0y&ZbB(_)RVvm*Y}R@yxMwU&WZmgar{0)(=$*I* z!YIK|B|AM9q>Gl>FSQIMhYRFkCD zGzXfz^Lwf&Sq=)^-hBt8%Z!UD)9SpcmPF?9KY#N!QQ;A6DPn6z#@IxKc_+a$<&eR46O~5Ne^k5*{B;jSsa|n9tc}d^Ywxwuwm}RkQw?M>Wyy|&#J4j!dOz{ z2$z1c^$%&VPApP$x`W@knZ%L~I0VX0>J!PF+%1=LGVk7j`$jkPpfZ8)!e%#GA)ALxHAP25~8S!nbSCNlCV703s5cI02xQ-*)Mq^JA^`ERKGh~1TDL98Tg*s4e zrf16s^8!sEjSJ8V1Vs5}e7ck0HSA}`-gS^r_*GoWg(d0va&&SUL4rp2W!+fnR@n#j z#xL~^rUK_Y2bHQ?HR7bc&0ux$>btE8u{v;L^%7+fEO2AJC zq#|TCpEec8%Y?Nu9kCi8+DOJna47-nPl;XZS!^dA3DOgi`T$X><^*UoB2EDLU<~Iy zgS8ilHYak&>{V~cTYx_+(`e2)tGTzzTQ6!g{T|S&Wu~Wa+UkMyooX>vy;mQ_5+X89 zbaF_Pf>t)wS_fxXY1uS<&Jiw|`{>~}TQqqp$2YSgMZ1Ml=TTD@e)3IT8$3B>LM*v58I-S(#JNISs7NUiEerwsh8vuJSESY3R7(|UC*i|S zuqpm0j@bAf08hl?fv01+I$|vm+3w&iBa0j|Wtg7%H-fQ@ql&dS1}1m&ZxXfC5$-DL z{eGIiAB+7%s7xAk!3$WL%Gas+`?qP2n+qnslwXZvQ)rEDPobmbtjlOQ z>99&6A#2t-MU0a(jF$kxf9e|EqlPioxMoEY`HGe*{hf&OoVGUoSFlrzK6fg9N(M3g z@k4(d)RZuC#y80wVv{?xA`WBGM}A>kIBjf3#}HGhx^TIYUk6WXWB;DK4!OQ3^*{=$ z5%LR{2ahxRcOR|LH-Oz!F8n39tg^TXM&3W4|(6tG> zCKmE|fSkpgBfX}14)u^X=2zC;(TV;O_Z6-+u@6+x%3_o4jX?LvestD(VoO!yWA5Ht zE}rhzmfG^@+n*joCjY|m72p!S@XweQ^S(N*g<&aV5r{Bpa8m1P+{UX7c4(aPC2gda z&OSKRxMwiZZqI5r)fR85`Vd)i5POykXPm;Z2%+jI=Fs5b$IqdwZm8W3ZRQZ&PcJSe zP5$Mi!$;N&=3hMRp!~b8qkP`;ac~Fvnr1BEUYU47>oU z=kISvCv=CHOBsNEKYYckTLqA90bMP`k=I|mlk4%@*ymG6`akz4*Z&*7I=WIAvV!Z^ z$h$U97~6VtzGcYANHZ=aqWwQbXuH`D5Jeu6)!fv<(S{U}ADYW42*14p`Op&luAIei zp9~_p7tbt-Ga>SiA(fk8z{o9yThF~Gx_%p=nW;-v72O-jEa`h^b=#R&6b+uZ1ZRu5 z6Yw0}GR=7Q+24M6{Px^za?5+}<7|~?miHa}=XaAxw*4t0%)dC>w-`W@{=hu@uU(%x z<=RoU{8^pL#;=6-`k^Zk?kj!@Um>}jCF$VpmW3xaQNg#Fk#j(IA96`F1XrdR6G(@n#uD*VH zEmTTGUh)n7(=zKJ&g93*2R@nwQ4nHS>I=1d5X{V6#8hJ?^MDFwi(+L>(LoK37|ucQ&~Wzq{GKY4~t-2MO84RDa2H z=Obg>uXr~gq9?5RM47N+xx=6KpPC?9yWLM zrBCz@-t`1emo>VIzDgj+77`xCYSd#t->&vo6o+|@9SsJ3^1vh|CJcOI^y+HA>z5D% z61NtQ^>bj!yGWd_xZG^N57%>z`;4-vrG=E~!u9viuzspyd0sehAI|t0D*Up$0%apc zZ1G@rn3KUqI}>(J4mTxX)^AkJH(p)^<62QCXon@OJs~9f-^y`Dc{4;eLcRenB{PM7 zJl5%_{E$-w;BRe(p24U3zz-anb9GovvV@)8XiJf8h2!~beyV5pBh()~ziQ3eb>#X{ zI?~r({eanmZkhb~tiXa6zIqc9AXm^OJpVoefB3dTeBq-w-9k2CPpB(8^-_L04{3~F;GE_sw6)xcoHU-qPrZ=2=WnfJrE={GgdY8kCS-b&cQ?TG7 zZCS$Y6&zSvzQMxS=CT@#F~E~Dwo@px)4jf9fF*~u(tvB&{%WvvXX}i@ngr6*86o4P zC14@tH3N6XGikS>vcrX{vFRF}^RZ;$F13Qb{q3ZfT;z)iLn}SbF%by#T_TeG?aPKR zmAt=@*~4W~Qm3?*jkVV8Vl)DZTjp-*XFOTh=`$P0R@Ar4rft6RgPHX?I z8|%xF?-kDSPi9Jjf&zvEHu-z!X&g=sA}pRy9d7Lie}@z zw(r`J7FS7$HRIZAwMPLD;2{L_ZNC#YwV*ygPTLiGjkC(5W)p%nwSiWIu1}#k@I|vM z@UVp0=NXMqm=<~5KyOeI*!fZGh7L|-vHHd-`?177uR{N=hVNpdjG}*8m#Pi;Vw2V% z7-*nblW}7K3tX8O8A-YiCy3VHa?+?fgVg0M?V^eE77#rwlsp9$7jN-LP|k6kTF%M4 zdmU2p#IojBnm8wNi6T;N2q$u*Tli@A-^buX&kln4#RiG!J7V5VGe7F$1Je`1`p8#u z#C|lP#p+nBkS0scdokpV%}TSW)m#2}ZXQ@)^=RiXU(z_(Q4k05+*(1iXEQU|J4|1H zasikED2M0R61K>Tf&d(@4D2DnlF>7oSe3;tmZir|7(BWwQc z@Al-RG2f2gDLBnc`KVjv@3GISWF?>9DE5v_@xqnQ3dJ2uz_F4`H4t~v@iS>BW0Uy zLDnlh*Y_VDW|q9N=%Ea%_+rPwAO-meEsobG@GM^Ge}(aHJ8cj@;vF_xBKJ#zE8aQ3j8Pw}jj1Ern$yCVz& z?!(=l17;tf$Sit!q%0X08upAqrc&ZEP-lHuJFMxwo99Rm`vNSk!~8JK&mrvW58npI zuA;?ihJGas7fTaacE>ZC9v$xM%!_vBXn^#nV^J)n*P-31X3UfQ^~r0gTIdRVLr9d| zkJC;4WLht}L&?nRKy^Oe7>~NL%W^(py6=-`kDKB&0X#0cwG|DT(KOXKCFO;yD=ib_ z5R5vKcmro{!V-I9Og|^+wPRfLc{g1B1|0EP$%EX%{G;sDL>#^Uk7;}HB=t`pwWfS6 z645L3?RB9@Sop7DJLZ)iKN7h{S@`QEID7}R+s0ln(r0g~P)kKMF;cq-R{)#m_NWFf zod4!2GnW2`YRXh^cNdZ^m-#~n#BTN_MImA%OF947@KYyo6}QUB#f(t`MZM`ttk-Xi zRyZy8BXfKQP&$qyA=Ek~?OiEWn(ZxQ6 zaxLTWnqS_HXPo`b#&z_st~0)RcyZ0ys?Q5qx;yHPN6%Jk6+PYHNl#{l5(X2Ivq9VErEB4jo|c_w4fv1*=TeG z)`VZx0(;QH77Xlov7+zrPGP_>F{Z0e*}*Owi`0g0Rr#GV#Hlryru>h#*T2enTz~T- zN2}EGx0?x;*H`^QzdD6iQU5;xVnCh0G)(SM8odW?DpTx%V$cD1o^~v_H>yml4c0YQ z)y-|5ztN+dbC`WnTUBRmWbxRp-io|}L-y>LcliR~U34#8P66rw=Vmw#SoQ_+D^Y+l z?um;BNIWKoebPqQ?>#sk8wDs&|C5qCa9)`l?xExgk*}iUepN0==sr5g%BqAmOE=Q> zS(xbs^)=cI%>1@Gop_BB4gkV-ON9Ci*c`Et8q~}gbxAK_>;sH-*1U*1zd71^)bGui zv}=1rvlP%Y3*)W%jJIeu1#Hx>p3S}YA4XLZW^M({acjij56tQ2z!kN*^YW5O;+BHT|)!x?y2dv>8+PZi)DllfuFBl0b=T zG(rb0kCgQ0p}A)}b-Re>PW?4qi-ZYNmPaAH?P88rjb4EEz@^iu84$IH>R;gZH%8lo*tZSt`TQLF=yW3+^LA+ykL;|wkjg=Zhp`ny z#5x#N#JYa8_mjPK{C)K-484=P1C(WxvTC$&f9eNg%0#Q#7sn*?VP-4W5-T}bCccEe zS_FERSEw=gZjpW|Z1^3cUr@cq@T*4Buc%%^c=`ZOr2!9K8X97VD^O-=2q145xoLuJ3cXlc|n&18hhpMto#r0Z3BF913KMsVC916Wm(W+DK-?%o zjQ5=={k043ccUJn0*3n)sonaMO2n{KP~fc|9tEelxHRYMnu^PFEVGp$Qy*X|=MhCw z@NxmfC< z(ez7o#@EuGr+Uxmx6^c0Ktzvv;^@}v!HF*8^ zT{zq{w4Z4!I{pA6Y&?vx0FE%wzct^+^$78dyK}Jg8T>C_dxK7H*Ik}#8!XrWN`)W2 zRMK3bYq^BFJy+5MDumM?6_N{d>0zup0(2L_=!Qx+j-DmutwX=Y39M=MCsoOJ{Sst{%CCe{TnsgZk?s-Rk&lE{juB^}P2R`!P z@?)lB^%yK;WoFPbGKre% z&WA^G9xdxJ{zsSG@D(+;{FL9R&w0qxcO=vCXd*FSMU^uo$`;-rf^@5wbAR$J6c=V6 zhQSNO5`Z7A&kox&kht$D&-c0UcQJm{p2|b=L*q|hdFE?s4}a=rz&UK8Rl-hX!@F_7* zWfpiv%BKn3C-B3H3OonA!Ozdp&G`uN1)-f$MF(CIcvOi29~IljHv^a2C&z$m(s@1& z+)X(m77uXm~1_X+%; zWCP+2fxnNeL%d2kQkaeMBjgmbQ8wS*9-I_bAlfIPC%71vgE&tfiz!&1>>o$3g|USnhk0KB}J6x&-4Vc`9mch{**OR8h6`#OwB$okq3HJ%HsK@5Y0QZ_c?%tbCLv?ml;YX&$d#yTs z_Orc-v}-6BPk8*U-Xr&c_!R&8`Nf1M;dc)Q!fBW4yI7V*sBpfTaK3!fdE9U~F(m$Z zh$j+X1CA&cOsmV(8wuYxg!dCSUT!IobeyY-syxp1c8qkvW#nLfsvKES|E*_IFPttGvY?@$<2_SWB4JLOJ!!(l;xf z;&0rK0)K+QF9`hUWCOTCIZ_yZ0lAFNg54!!ZS79&wYx%bHl_06fp~UsFgD!HV*BJs zIF@EJD*SgRqo-LJ^&^dD)a}T)OQxUT$9@ezwuw5XNM6u>?2A9>oTYR29zj0uoIQo0 zkMcVzz-+&4HHjvDifm3#mHMV)UGJy;Qqu1l8g9!qG#1X!rNXhOC!{ZOPw#2FD~d@h zx;f#fKA1T;nMitKzM%4WXWLK`ke&ebqxR zqt;_B@SfgnQ~3q39$z{-Y+WAa%w^8wFDW15PTTI*TFrH*QcD`EUi#N$bc z#gFp%L4h|NuK0k<@#iGI2Jy(@#u@681|GmAA$}dW%HyAF=ocyJB z!qCn`B_6Xl^kG?^WBe2Ed`B*iL$7wY(j$*UA>I)9ak2*SNZ{9z%YeJ2<9;4EX>sBr zHv#v^<6_`GA%0X*f#-lX>^$*aet!I|;|lQwp&g>=z)Qk$Z&qT!M}aq}e;c^eJ~;+l z6WULZM+1-IN10y+PJ0{=X*>T78qYbjFU7-k1b&S3_T#PrN0cMQ+%Qkzv-ozl7QejZ zTKqwcuY=d@#rRevKD+Afw`}6mBdgku<#1|EvV7uoh`U0 zeWpIOD2z7idulV~c~P6rp1w2qyXd5`-af|Gsrr`tH2vlJ7L<6uuF*Ed6$s(Eke3(4lVo9_j}G9o>si5}27BcXc$>zs4l-0d(9+9L66NPEL0w(nk=D&$kybl(4{ zy$j2|J%iq%aF5&ab5Ad6qlK}hYAHFH*|~QxlXQuV-ic0Msa@q!n&>Ltwk{!^>oBpTh?{4RD#x?A9Hhb~EXA3V7r z^+*C{l$z&B5l!)X@3-upnKI5uJV5VBq_B)Xtjw{Dr?<|z+bF1e{(-hJ*cMe>)jkxW zIhzeB=P-Yc6!W1Hk8#et`0P0?^Ik-zBflW=4d8~vFLSu!lKAI=6N#S&?w0sXz&(^R ze}91a`*+?&f4@9v%fS$@tJQx#E?NCUWAXHSA{d_>Y#PaI$8epH_4X& zNI4QepeK^vm@fo_zL+~6n^}SiuZ9YHq{^GXeIi#@fX5}i3;1xC_@u597;ueW3Cf>GK1e?!dtn~D+a=lbT|sG!1^jk<z~G|JC8R=cIOyLA)mLo5>n*#5vnXfVDHtdl3fk>qyh#ijQ)LUk9!NZ~ULN za{zKBi^6bjIv#W~NcT*f9>>nuHrKY_+O}<@T)U+$a|>$~*0yb>_O@Q9{cftuZysjO ze@@@~pL6=4zyS7JJ-T~^TVvW=HGmS*Yo@vW`5!TpTILWCZ`WEqZ@9R zqrn|=S%>I>PLY}M_}l8!R;LBqsp7?_V7=X$d4h-@-aoRKTs>?nCE)CMXw%yKnMNG0cJY{0pYW3l5 zUMu~Xgz-TiMFALPl443DwWyV=*~Z>q~5up~n6aW4B)s0|d# zt|NpP5SS}zV*@Fre@$@T>ZVu!J)(?w8{f^bw4`o$jXSP)`Y4z0$Wbg%Mu`}ip7CR!=*=CVm>`b~2p)1X%SZaT( z)E40h>g<2|;^(tOxA(jDi2;q8qo8KXs+#4C1$NFLfQg_2;t4#zq|lHh=%zuH?xhn( z%i}gz#2Y5-=MHQE;Jr9Iw5NtiZ*Bk%?J@hr^LRun_ybNaCjyc7K%@28)66z=gLt~n zv?gWC!QvR*Fvc157=;_9rr_R>H|*^@kiTo%>*iiSjjaEMHQ@pRX9{6)as3SAI#j>j zb?J&io!3z4!A#?#ZC~K@Xfqj|2g4~BX2X!`ob-e=A&!`rEApO=4A83b1XOB$kCc)F z*J?cg()c{Pnn*K4dWwWY{CS5P^;!3N0;25&x7X;|NGk`-MSKp7coX$5DV2nQfkcFw zu8enFvT;I`88m#T7q$3O0MbzdH-q5Mf7V-AFc|aYraO^uP-Kgtf3X6oyFt2Xu^Ma% zsqhV+=YP}uwb%~rne1pjM&o`4hl)HCSEJY;Fkg?su3bw=3hg)b^NjAGz}qUeMqhUl zDeJY`uD{iE7aW)T>-yP8G-q5^Eh8|i51~JUhPyN4j4x)0qtmYzgr~Ar2Z-RNi!hIu zBIgm&F&f{aAi7La!Oy*bnh*q6s;@ik$j?L89l^yKD>#DlHBN0Er>rBja8_BN)^{Om zZJ4t*{*bEOjT?VPA-Z?;6KV`*?@ILSp}T$KbA{d^7?Ky{jza$#!mfu|xVrW%pm!if z=K;NIF(4C2U5-v7*d5qY=EqIbjGJbM(E=-73`=Jhz7+T3JO2S+@O}{9WVeCj;;CaD zb0s2s!1({9eFvNy#r5#ctfWAX3r_z31kw}IL+@ben;q@xB-_CE{XhSFE6v-PH}Ac9@6FTHmT{#-PkT*z znVRaKP^e_FENjRlI#apTsfkV55;eG~+uR%2H}7*4cWBa^`r>N_^$|Wfn+eA>#%KVH z_R&F;nKRNc>&A3`B-ow`$0R8bnd@|}TBXry7=U&G2^j`g=6>YJQ2t#4^xf8T-rL_csl$E9mh%)iIed;5pUMWAS@|5Iy`89H%7HU+Xobuz9 z--M<^Iv>Ktp|XF0S0h}Hy-T2U6wM+04qgpq;Bi7o%d0Pezro8;`iZxeS5UnPFGKmC zlnUu~)XEb0DU|-NV?w%%ARvj~e@9!J)q4&6561u9cZ77Q`ZA*Z(Ps?#{>Xol9?k7ZFuD!rd_ERigzH zP``ZX#}lgs0w!0Z%9H+~qR$$&`36h=tm4d_LUp_M2vtP{^u6OARMqS$(?Xk(=rMNE zHY2ICPdy-iwAN-9;xnlBoxm?I6Xy2rFI)6G~AY%BJ~r&wPq0 zx5hn`)N0bR(6}_ccFy0s)P5!?=)11!Sm-I(izQQg+`;PRM%Q#lh6d*fJI4vItO-O0 zOCXrbb1cKK%NvCY=u7@&6)&6XuTm2UjXfMqbv^J<;nwgqg zJJ8kBy;I{J>$U<=8e=CX%Ux0LV6HW1=&^cC+QEsruHi+acB0g^N@x|GaQY(BEu|ne zX~9zf8B*A(K~fnSD1(*XtH71H)u*X<2RGjQk3QWuGT`%-_3hsPx7-H?1(~}LN3Wpr zffMGZ>U)1_50YAa0o&t~QzT{9n2jW$UZ1!A37o^?vZO)ZX{}!(4$bx&Gv~>(cS8A zE!exA5_0>hrH%vl?u1*e-e4M9)i)jN8b7*WZFm|DeP|g|}?b{yYh7%xJ+5OQ3=zdnPZ<5R_WxBb^Zpmv5E)? zrD$Yl%jD4wyN;S$mS5RUB$GYXQs_=5lKEcy_~PO~GL~B`4A1q?m(r~pZ!KinhUiSP zR0J=@+Wp>H)?2dWJyL0FTd*T=Dll{n^^UD=-(H?yx9#Cez+;`m z20fRw%x+AKS3>Kah;JP3-d;Mm<+QI|?8ED%g*EWdPRPL1Bq7T0%P8Gwn-sRqwEUXs zPg2jQ+QMTBq9~2^g~k5#SFZ@^Q1ue1!0&%;6w;m5SFu&15g_Ao`R6eHXR8DO zvDN+qr9aqn{rA|$*u>V>kqxo2Es02P(!xevd~e#(qS>~!|NJe*Qx^L#+E(WCYtLxw z>bIpA_I4}`3DVJ_$IMBkqmv(;K9BltO*-dNK0Ua(CLQmBARScJf*#*MW!<>!@@mlI zJqQALD2x0{nI2a>%7$pU;4`dHw=~l`pIz5+Ca~)g*T=d`{#ahF6g@>}UubwTy}8dUtc@K{DBGwV5*QpdWGlWh0N!;z6hYbefB(86i#q+w}Q zX28FBq}k@0m&ly~<7&S4_ITZHvXNzsdUaOm-d&a}Pp|RBl-E^rP`!Ee^f7HS! z_hEpqJf{K|<>n4)4)LpQ{Zr4m4`;xU%FgzO!Cm)*vcTJmh_~+}eej>iTeA-nMR{#t zAgz#E(dd|pG3dtE_Z93h+ByPS43)PMd~D59@7_x+DL-fOShM8f+P*=BoI)P#G40ZL z&-Rj_QR7G>eMlpm&}W*?)br5bKQPV##*L%B)gQhs2>j1BWhJuOdXsUJS*pG&b*|D59F%!*CMkY%gi+p^hWn|+eu|h}L9!Ypz zi%4d6)JlKFR_H&8|KjnF?`9WvTSwT_8J5ZlrBH|OJnAD41Y)Cs?wQh#?%B0_egHa) zBaD+vS;p2RXDW(d`0DKr^V*TFot0BF;9UDLb1uhrQYvBXA37E1e< zBbL9QTK@kdmX2<(A`lvkixG?HeWvEt4|R4oM=ag_(ZEPssemFDH;w$z>fW)9ChbgD zEn+dCh~-6i>w82j;mYq+;3K)k-Rj+;wYUCbQ1@5{e5*3m{uucDm%!X|#PSv@|Nj}W zObHRo3#k(#mQ8C%=V}ql!%}MJ{KP3)F=El+b`G2nvC!`su;j9?KDz?NE1d`L+lAtl zjqK3so(UAM{C4Zc=&FwKP92-9{N?bT#XBw<7vhx*rb^ppi;JCZvA=x>aoHTNoG->J zS1aK#idU{#j#vJKXj36yl=;AT<)i`2cVmS<9I&t`U>Qz^alqp2FO^!vh{c#nwwItX zH4yO4=2Pu`$G$w=)3w_fULD5~OUq!v8kucf4p}^zjK{Txz%k29;NMto9?|9-P5y+K z6#Ii#Hl!N_UV#u=nG4RWwRc?F9wQ6(A)UkgB*Zf!H)Y;x0<#V>}edJ04 zAg}j2@de^cBn5(Nyr|LQjoPj5u+nXD@?Or#3;o6O)fwV`;w*v|_Z2oASS6H!`c%trN31qi*kbiQI5@y4S+CvKP&`4>Rd*dAyc@_9;pcqNlu0&cN6^l z|C+jW|8La&{XM7)wPD#cQwNBTfG-oT!aoSN{Lo_S`3hM~#!pN})@|?rNJ>bl75>4> z&@(%-1DcjxO6#^%t3p|D11cK?FA3Iyo_7%f&Wpj{K?1G6H6onen)%{Uv6=xt>|p?$ z@7F~$dLv^%1Y6}QYIL{7OGkYQrG>To1sr=24y%YGT`Sn&4gTn1AXvcx|6`?8^3l_* zUOMJgsLTS6Y8BJ*I^OH}ia;NFeowGwjQdX*cK}s&B6i=2An@7d8o&5~1e}bb>VK-| zqm>mOh7@?Udfu^XYY?yzLtYmki1St=4cfp{!rl0_qaC<^d|B})_Q8wOU&?*Sb^jLy z>6lO+rk021gsn6D)>6+2oe6XWw?j&fG-L!FdV+y0Ef@k;00g?zXl5e zoJQ~hxE+|$3q-Y80?I(`%#s~|BK{68fr76t0s|`BMZAn?cvzsm(9}QO6w0_WRzB-a zznltrGmaGR%i3$}#Ge9p5){Hwss5t!oPeVm2e-l>2sk*QeT@aKw(;s$!;^R3!Ci4# zu5fhC!>8Q@=-sZ}uim=t-t|Jy^gUE6SSv*f3IZt}yFmV9!;^R1iArT#;SYpjmH+H^ zo&E|g1_-9Q1kQ#(#C4&0k(F}~nO%CP=3)7PC5=^ehWs-yKKYr+kftKL03YEPUm2E+^uI$%9b>oP-9z)_3$5FKo z0_936hDy4{9Xw^uw=ocOW&Iv4tqnyz^33@rtEmORkfI}F83;_x@&MZMaZ@I#&km~O zaW~UD(#P2?5|Ur*>FX_dJi9e<50T52{!b!v;O`xxl5CD%S zBncu7gpgK&kd!VrAQIBgI?RoPAWiBaHiBL>av=k6DdQ;ZL}?dJzm3xPJ=Eg#JN5Vf z#OZf&Iu0zr1lFMRF?B&q{|2Wk%V|=M(^YkW0L$rR9go9jfu*M7gViZ;7yJ*DK`G@! z`uS6oj^ngUNE7zz#oz+?JW5me{ZCLjh0}8Uz7?f!!D$74|5ubA#c3twLo&anx(R#| zepjfO0vWIiJlt97y^Y-d?u~+G?61m*&%x(~x11qk*x&Xx`S*9t!kZ1%O~i|}a-5IM zyx6v;4V5AY*ieS5l`{AYnf+~TZEu4oDjl#0z95ue1RH^{`Z|v|UXIwfm8if8ITi&Y zIHq0h?_|rt9gFPnZ#tuvCLswDtzNZ?b`Ex?igpMMDxEtKba*+H(GYSEPI!Sl!tFhCXhZ0CqQZDGQnNi@Z zF)9njL_`yGaCE;VE0sX09R9gaGowp#HJDR2wLZ@eiA%^BByp@ zRA?=h!&7kLbry*Ax*I$BURg2nz)zCP*I?KMf!=hFO5ybBR1!tDMd!6AgZ?$EgZA~K zg)W(dQ8S!GN!B*WCeak!Jm;M$I>-CjU~;m<13w>1*%Drm@v%-P6W# zM%6mb6ane5IpXj;%BjMl(v%7mrz>VwS`68vcE7YI;*1JT^QQaIdkXXpHoZITDyAuDtJbPR~6QFFJ3wlR#isEZytv)A!}@_z64)I5;71z zd>do)xXB6kSn?>na;;Jh<*Nsx8Ke#1K+nPT`Tn!Vdk${M_aB;G|H;{oU6+rn{{;HD zES;K&wQcRRCv6%OYbN{s!z~QM#q?a-+_HG#%>23C=wo{Ix!wHmRZHtWxh*$x<>qyt z*p|CCK9%p@Ue*{F$K>hR%-E1@Y`s!XNE&Fj5K+{|1Sr&xaTRw-6?_zKOY#Hw0$$l? zx(4|9ely)geT!-@t#f(orQ$X3!wz`a+mQ-%1-DQhj|}9=FK1gOD&hC#1kt<(v?CAq zJ=8bEh@v2Ix)bs>vZ;nk+JZsM0@ZxkVpFg}imW|A+B_C=wZl_1D0DVbsgdh-QjJ8e zQfSR2)iRx)D!0s}r#dIMw{I?>$C94a8#oT!p(F1ibrx$vNm-+$4g#ehb`GyNCHP^XNxaM%x1|; z#iM5F^Q8IcQM2TE0r2GS|MVTH8P(qh_Q2o4yHVubf$H~)w_`1DZ5K6j*~V)Y-btQ> zs$27ZDkL>&i+V@E)}A!C=;gdrrL%fX)}W(%^1Vm|d)S^fX;f{eEio>fQmHx%63(Qt z87yIIG$lVN(fB^cZDa|J+G>d@WMvKezqAlF>xt)|vYBR$T{%>uS#R4NW^*}~)Y!F_ za^Ck^(k11m{qCHvI5g(fTa;n_utINPJIbMseG_w6@9Vzdip02A72h7){OOsoi$AyN z)Jr=Hs}{c*4h56HlPml^Yo2V4#S5uI%cg~akVfT^SH8*H9qn5OCJ*-Zopbw!D?X*w zxLDKp$2Oh*z@@`;SIteHH6FloH20Gu@EItBylw#TYeP(j;FSa^oGeLa3O*8_gem-G zDEvqHgg>l3kKXIM_xjW({dV7yeg_(;x)=Q|>Nok;>X%Z9)V(Pny|{AlYtt7`e+m6V zA7A_0*94hvL_z;mWEYBV?Wm3><7hs1t)lO6SAu*rfroJ+-FsQqSWe> zt*Jb(vf|U{Pp+-dnqIvI97z{A#*&c569J#ArN!rxg+ojto#*+I#xS1m zK(ZbNw}1=DQf*Y1M(s#vC~;J`@CWV-is#eW9z_o~vi9;IxaEul0M+Cf0Bn9(pdD2J zK2GKcAEv!<;_OX9z*KL$Co=`0WK9|X)oiF3^wBmIoqSsJ4U5jLFSf@J^x#Z=TMQ|i4}k93V59s_3OnqF7ACE4Ree4UEg`#QuIg=*qy;p}ws zbjgcPs{twh9k@>g`pTioEd+`39RU|$ZSoNT~d^7$GRZv4#QM}dOXLmr2lcZR)o_?#tZWnvba*IT(Q69|@!=9ImqGv^K_S$oQxYTxMc`&`zb zi*6C@<`hKFC5Rq1woTLWL=7T`(onSWmjrQc0-(xq*^2W;Zn!IdGM=K zl$;K;8@eiw+FEv-OUXztKiu8BXRc z`SV@Y?$4|%Z^;OyI#DU7SgJmNB1qxkSWYZO?o90;T>1hkb=z98)R~|R){~oXJ0P_b zEcMJihh%*lyJesZ{m6$U50^8_l__H0Q=65pm)%D8b`Qjib%AuBTV+32O`nt%I=}0q6&Do6cub z$Qh&A#mZEQ;sOD2ZLh%RQEgmveT9?MZ9|`|$>v$1;qNxu;()pL)196^3nZ9^kq zKS7YF2>A(uyoDh#5%S;FB=H)C#6`$|Rb%Lkryn3lLWKOHngmMXzYwHFg#1Q;;8IBu z@?5nI7;&Cd9g-y8#(B~rkgrr8B1#z2R)Y|d>YE@5uEp}Xt1^!ukRZ_5(luB< z7*c%`iP(oBF)Zgcb zU`V0P#p}d&ViC&+L2wIxnAnCPZDO8IpaQ$#XR&<#P~C|j?SKYxc&{KI5t2cW4Hyy= zAtj&$ix?6YAz>f`o8X;-d_+ha%5w(1RgjMe=@uZkR8oYDAj}7Go>U#81RHUlvp?GkT9A(jaiNvz6%5IVkU8Qm&PN&macKbJaTwLB&m9hcq&;Bsq5?>e+e&b?^ zY(bvUA^OFprOJ(m`ur$S&d$U=ybLfZjY+{oi&2j)qBAnX;I^)E>!zZ^sxuhWPG(~+ z!aHb9Adk4(fUti9ait>S%d?k-ntWx==L0ng8nbz`+30KYn%H2Q>rpAGu?7sL4xfPo zz}e%l@WIYuze!{2AE2PNT+O5JrW61?1pL^3zzWj$gwqtQF5Su2)9&3M;{Dvw(I>Pzq^{ z&Z1PxG?a#>LVdD6)l921A(04Y>}cH%6z41h6i$v)uO&nE!8WTQmksH$kB}s zlUDCHX*;@=L9&t=wa`XkO$$(i&%?J+OLPgl;2SR;)8n4#8qc5NxulkyrgPK#fc3Zu2=nPIaT22*)2 zj}~S``cP?~HRvVfa+;%*jJmy3rPfe#15{8!r?2SodL1oVxmm;c47UHaIX!lxS*FlB zaGZD>c!InN|6V@sycB9h)0z+2-b>AOkcX*+cg&TLNn8|E*#bsWS0F%1tP+_<=^u!K zJ7wUAU^2gVhcgh>E8&twH?*YlGhL>!j0;$8)}1!H-;RC zB$7ZEd5$tElc4C^z_tbT=F<$UO>bmv;JZq@@k>%RDF3tFBveI%%Q@O)=V;m?)T9Rr zU_dpg2zzrJL-IAwBC?63v{og+co$d#r0=&ZwQG5d;Mpf$_Eg_s{-Fqn)j48`P!6lU;QyX96kGZiW0 z9!Cp4246xJ;t~5%vBxQpcx0-nqq!++NILxt6Da#$S!|PiSy~P{`|TEbvQTH4C6t?oMo-CvE`VHmZ8Fg#)saMU`Dbknhth-%zt)W_aHxVv>q zK{0xrL=L6U7c|=J{&I5IAmgkmh1Bb?*xgo0Mq9hB2BX`_>FqRwhPR9DR-fHtVjLze zi0a;n>h2;t3A4~r;%SOLs;Q5@Fxn#>^oHm;>3oQyl!z6!959$c^+^Y{X3_VE%OI$h ziDs64$j^~%!U$hu>>>tGoe+H$yW0BoL|-&Hd% zCIz7$n@1{_xLd3gv>6PPM8%qCGHyUhCD79q0QcJZ2g`bc!lN0t+6;Y@zV-th?T34U z0|^%^6{us>zF=%u4#;BVcCNGmkGz$^XTTG+b7BB5qfXppCW@;Oh`(W_6!!==-2wJe#1sPCCTbEX4>G^$+Q$@lB=;cFaqtATmc!E zS*d6BcDYJrrs;@7FN)e;+)%W5n7-JTn|2tS|Ek}A|eWzMs3ZJAk_l4mwL>_Q_Gv0gXsIIx^!eb!iD6N z$HBCgt>Fw~MLBh9jW1{8N`7-hrsB*@TZh%%9#C3V95sao_tAa!OFIW0=|U`w{|)t>AND zGhQ9aHOI}3t0e#IPo@0AUv_jfi~hjRay)7_p3nKwBG7?>QmJ3)6H~-4@NdW?TqDPg zon{->P;!F28*bDWbOD=OeF9wQJnIoTQjFWXVzDmauPqqxa*R%6rP)NOlweI(jgH~G zC@wG=#5X23UM|O3y7tCzFoEGzXJ;zi(UIz<>em{D{=(NI{JZdLz^`k%-TT3F(*GUkZpr_&hG)LE%LNsO&7oxMzp$ug0_+-Q! zjk-3}oTN#x1GIpZ8620YohB;^5j{CaE|=WUYYZBD`Xv&iSPs2IlhelYmh8rE=13x# z?CSeE6X24if&DuqJp(>lxTpd^YV?k^rDt;hr@5r^)1Njqwr-s(~CL%jbjjJWWLOI`%ZMZx2MmlQ|0c@yGJ3x5@0N+Y4Z zxhNB0(gPN4R3cT-s)<;cHrrOWY>K!i_cF~fLD=(qOieOk@jP2`7v(c0@HItc|ayfz{5Qe(^nX)6@ zwlh3U071iH5nd*YL1a3iIGrR+?X6q~TdTA74H+@8PoBoLEW3xl(Ce4|ldwS## z$p^pmQRNYdTyjKtn@ld*Eaz40)8lEtDtTU2K}%oJr@Hd*G#fOe?QxTe$G@4YH$xxd zJlC`;z2^GFTa=C)oSan4Z|;ahY8lZP6Mz1a!^zrS}Z)9Jaa4 zf=^0TKMLhY*X2Z)aOWcMQY2D?pcfQY^jsj4YtVO|Cu^QbB)=B=BK_hi+9c=@*l%I( zpq*cpC@bH|dfa_y4!ZqLxrUiV)Sy3qKlQQv0pCXI zm(;MYTiLDcQFf=29UlrVQTMBiZQnlKFmun4ax?UN^rOdq&#RtH_op9Jg#Ph0O(>-L z21>mB_Tw7<(nF#C{(ge2zKpEMgJ_fzN+N>$jDnA%5h=j{UWdS7>+$&-PMQ@J{JE)h z>IbYdwDn7p%Fh%JY~GkrB@CDB@+(b>Rq{6!v+WW}vRSnxQ_BE9SiA^iF1SD%+Bga` zV@rwcITg<C8E3nTkPs|7n|Kz{;Uc_50FRB-EEqjAE7nZ5DG<(1${ug5@Zy?|@g~mxvfqA`l>Ol3_pGfG6DJxV+J#kQ1+@ zAcdVA(#df~mpv9H9q{Q~I&XLQ z93{9zId8R4dQ~`&~&k;*r4v&+t-;>{hmtimbBLy5`Kzt{Dk3YYQ@K zo27TZ`(Mfzr84**<#P~uQ7z>`Httj*6W4X^9ZE;}^vG%DkwL+P`>9=P(sYPNh?&1I2xW1nYZJ z)c01R>jaI*F2ZCIf|!$Qe*MX1vpg!5f37sceqJ|Y(%xvRysUU&Vx4Y8*(xDZ%Chs| zykE&E=CL&Z2sWtJlN7mLwT_gL&w>C4_zCLNFJ)04JD>${8Y-im*qzXyK z;L&IFXiP??k`8i6er_>_NeJ;v0%DEKU>`1!*|H%O?_wqK|X*jtkLkxcV^&uoUx% z`lbMiTUm8QvgthNYN;MYMUgYq^uFoZyMMR>M z(mPY}(_7aU_U$xXwR!I2ySu3k>m(z+*hnPgv2TOAeSocC^VAj^=CnI*MiQQ?z7F1i zmtlV>5Q6(QpHDEG<%o*K>%=g@3Fz}J4t7qco>D$8Nu`FBV59P4k7QgmsGje0v1-?x z+}08b$ZeE~_qoB`U`sj?$z(i*bZWIu*_Qi=BB*pmKN1LN2)xex74S1ucLLj~4i@l# z>@4a71LBQ5g}S}&k^@S<)_O#J#DxA5a)Ug#DF7udy<3r**_`&oP0`)z)9795Q&l=C z+=#lQ^Jm&-mS&1Ge*hrDb3voqYHeL;cgq#eNvmS@C%s?LR+n%2Sl7I zgj#@)6eqO!!t(H6V-)FI>Amv>5a-IS-dVoy4eHU2o85hlO=`^<-_KQzJG(PnBvC5)qT{l0~9$Mo}Gpi?am20Tk z4l6q*-^cJwK&q55JX>m=>1gjdZNbcQ(hiR2fFply*HmAr8#rGcFC;sT-R;wY=y`{= z{vA8ODZ4czsq$*0eobL`gYv-s{rd?}oj|+(Ho+V5>Tn)#pYVd0JUR>fgtb~-eg|dn zPNKGV|0OaCKT8DR24PyGC zAdNVjk%-d~5mo~bKSUfIg+cf=;$}jIo?CH@u>^jIi- zO+WBJS{TJfxqe^E1sEwG2o%8YE7v%{VC9<*uq0+9AmKvqpM_>2G9(C(C+7*&aDrzm zec++WdT^Gb@^vuk$h{VSJbm|FDWOaTm3d*gOa@7S#1%+0;2}%pDhC*=e9ZyQ%H=@h zvD966rym!}pf*MFbfYr5T0MM2TY~3=%HDqBiPk5c$dw+;ef!(F$Amo=#M9tO@JE3M z)O!j2>xNHvemZ{XrLR2yyyxgqtQ#eSb%CJq{x5_O{drK^BBbcgbH01%yd&e!1LLTt z=fXS3U#k4Gq`$E1@~%ttXQ3x5-wq7mC^&*ou4ouZZ62-!7A`=Wys{QaYtE6evjG$B zleS0;Sw{x!W{iQ9ysOt{VT}GX`eGF7niBF*xJBs@Aw!=#QEh(W9`FZn1tG0z zs4s^+dK;L{{|TSgGDzG2{|es38ken~D}V_JAX=8Ug>xoMp|~-m>B4B1J=hsTuECxag!gnx~>WIWsLxq7zEHzw+q}xwL z+n~J#S66FvJe{3R4!3j{qT{Ijg4I{>Nl$7bTHiNb5SM6(M4+HCmu(ar9u7QM3a|NKxX3|X<3Cr zEr;~bJn!Ox%xZG78a}Qg&i^jww}NX@mD@?>yB{O) zp6>Hu8(v9Ha5zG9Snlg6JNcs^0~@a zF8#TnrKt3)sB}~)UC3v1ITW7rNP~oV9K14s@zmj-I;?#Ygqz?4O8@|{RQVf9RlbG4 ze<-Z#x~ThW-4}JK!nLpHPxvZA>k!oLN_;=e^MsyA3+--V#N!==TUdgEsQFraNuDtJ zdv|!MD`;h$xtQB9lISzgVaB)sNiNnk)skx+x@bX>^7_kY{Ac=S5=s)^x&Kf(;OX0Y z$t9Klr1LtLHqd7XFuhlQbbnt*Y3%O1C$cfG-tA1{^Ec2gT%?NzfhO9MMtq9~i+QKL z;xC7^6Ecj)i^WkRDQRZIyd~a#QAPpsd^tj%W=&*~>yXy83Up9xe#wq`n+Y@gM^zo(5|N z4R4|fSYSmJnC=7HUa*36q{X-ZH|4Cb`xm*$HE{`jF(MNQykFlLl`$)d1Nh z!J={jf`FGnyt_7I@E8JcGh8@!Z>>##0KW@ACcIIQ@Vk{;E4PBpAcmit5i~?x297{A zs?mmhVq;WL3$n3$T-k%O;uHVkO(eX&M8X&D<@w%lNO*>_t1_8Y+3b8KGyiJZ@5^L- z{&at2AR6tDMEaxAfk-I3CZAu(W*74LHCY0mUhqF;82%j5qCnJp3?9-@@EE8GxcS(v z;oIQWt%#Ki;5FNh-F+JYP@WhxgV%)Kry!_{M*)Ba0NJr)1@K6v2MG=~=(aML#{FN)fFoA#9SHT}^^hyOI zHK3Eadcngg0H7K`G;&M8hCK3mE~%IiBdTW>1acU+#Ix{!;CZz@p9S0!9>Xl0KXzXN zenkeyj$Hw7Kej=Lc5zN}I}F0#<0$u!#5Kf#5Xn^Eg*nn)+jAhyPz&3vAw>m);ZARt zC4b$<;EwA%BEC7WF5G+h&=Yu_MqDFk5@y+3Gvi+eO)<< z7z}vY$}rmQvpZ#6CO*a3HH=Da4(k2P*g!a2j+In!-Vx6Px;OdzT8&C`tIOZ#(K+;$ z-Lo6~!k&Zb_dyjtT+=u}k~EDR2%P~>U3dNUKmESud*9Q5eh{oYQ~4!`RxSpI!P$b$ z_ku41J^T~)1@y{v+TLM}S;zwgKg2f+KZ+qAf&0N%;WPNI=O1Cn-H76AMT(DN$X-5nTlNb`8r_I59g-wc<;LS_y3MwfU7_R*CPuEeL7yhrAJXVGI+o$0GeX&K zBhPl2+)ZdtD0|rG>U7yzRHVH9Dh#Nubu_QJv^kZCq~UwphHxgAN## z7QLQhoh2s>MCKwU&S>DQ{sBKKXNKP=UM9C-T93Pg-rRKAJpBD}H_C(RSD=@88nu=T zmE|d6=Hr1KSDJ2iZ-w5o&t|^#B_YpG;g5+5xn4YnLdbR5LGz(cXs;*NpKYF*F`td{ z+zmU47g38^2!gDIxF`8lvS@7OIfqJXrdglfOy|NVp|Q}c*8oRK117D(6%8nh12p;) z2?#ZR1O5WI$xZK%b%ZWQtuDRR%5uEHN*7~Rw^nCkS>6DDUm9Ta8aKvj(&*hatViKC z;z^`gB*H4hv6?@t;kNd6VFnStLA*_-YHvJLNCOxRe4|*bNvf0h3(`Ivwqbn3pm^$X zTe8hYdbFuTOP9%`iuJ+HXpc|Nx3z}U{=S${_80J3;vI53Zdq?*(S<^f%C0Sk!yU9! z8S8=1_O)t#v4mIcDDkLe9dIAAp68DL%{|RJy)0+z+8*jC_{1zBUMf_=NG91WQ12G5VOV~_)p_f%5yZ90LAwo@3kmz!yWR_!$GGS7L3xmze+>Y+wIL5Y<#PIx z{1$TS>ebAF145q7l{eAt;NKR`3!+ST_0WnB^PR4-yD7$Kv#a%#bkDw^U2WH?+ted&X!^jPfsqjq;9QAk>ndX>RRTiyKX)&2UQ*BR3&EtJB-+U)`j ztEzf@dW{L;5jO?qG7a|v&qNcxoK0Bb!C5V8I`Lw}?cK=yzdBNOR$hPdNz}J7RR{VV{4hj)Np;J+ze5mXwI7Z6eGWn7)tPsnMv%SL9<*cT z>j)yN&b|9HY>#2$2>d6Z7QCf694+uyl(}uenC`4B47;Q@Bgatf%9&srDp7(zAs!<4 z5}L*mLXp){yFC~-lyYtGCr+7OtJX<+q!DL8@D~IRo+TcI590l5x#REQmGQy2c)f14 zA3ST5C0zA;b0cGTS6HUHK=`WHAj)BN)4Q(_Bsq@F~l|v(1wfJHV+8I?jYJtb+{kqvPnH z8W#77beuj%Gqg@^p<6{dv>jTr&R{S)rUg2_0G}dWCqLDQr3J1a5$RZ$a_MM|iqix| zLTIajQK^k;V_uX9MJ5mq(~3lz+?Ytq7OBy>u1Jk0;tkS@@HkiaS_uvtV?&X+Qy4`m zz&SKpyD`Kt%9bGO)My+=9+CQykC?Y~C_`zjT&ZhOhmsnFQYX@?C%^fBQ-?_P1&lJy zn_U{6gN|?}Wio`mYg}|#WTI0UP6@bMRH2ku$2UKVA^s8A;8u&6C<9i5~{ zoe0Ox!;)s5TGkFb$FnMLON3YE#y8SiqDF(&f-wFPMVZHthtd+(b*GB7+(}mCW7wXaHp1QwnqSbsNt;^HSTr;uJ5u?V6L=bPHw%>?ct0}TX zi1fa5a(WxrvK~jT0((>1#!NQTTX&>&dS?;6wiD@XRNrQjhw6QDBh7p3-E-I#h}G%- z4WiqAJl)OMkE1+OLtoCeHBr8y3BO4F-^c=@K5!!SC)dJeK0a?!Bt?biSw@)%vM#Lf zja*%QqDCUVkk%hXd<9SB>*Vzw$Keg{Wd)7=UZV^x*Np8A#VbEY>aZK$3S~s??)YOU zox*8S_%)8x1vHOf5LX%Gd?a3EfT!F~k%Olk=^vxMW0Sn{l44cK%)qn44_#6D;YAmz zLm?%|Uvv@T?rns_ig4huF<$`)SLDd@ly$S_4O zpmYhRZ8%*)enE@V3Zk~I^Cfr~ukp6vG1Wqb$rLgIr4-k=2kL}VjUM+zZn8#%N6*OV z9h39J=rK67tDIhU!T8ATQhMD*Z+^L_=gZyQzua>FsoT%ldjGC1=caqlom+k5f!@Bu zbMrSG=oKXf4qf*wJyz+*8^+4r6tK}gz zJoVT$DkM6nJoc6*B;flSV)7P@PmA%tQGK11;j~WRU)XI97ZH96rENkT8Ag~R0zzx? z9`xy>eB!Axz)}XYd^u7%I{a3Tt6_;Ls6nyU;t`dAq5q4CAC?(P7be@&m$#SCosB7 z09AfeQnRXcazRCEQ%cGeo$0=~r}9+Shq_fEQJMwJtwE?=XmdD(YDctW3V_5a>7gk~ zU|FFA)V)&hb9=G!{HLxy6ZFN);Z|S*2|t<`d-JA)A37?GI293wQ!qw`5YjP}z67VO zSfAQZ`e}F<-n)>hokvo;t6sXicY#L?>mc?s^(8mhX$tv1J+Y3LYpDy)07gnnU3kX$ zhMVL-Az!P!=-e;g2BmP5AcVE53lD$gR+Ivz-Z}Y?!n0xNzD@i%FWa}aZ;m=699HGz zdsZF1Osa8ckx*1c`QEvMmrAu34IUjt6h49}wqTibAhO-?R)O-2K#9;X;IkgZO`nB& z8(|I#!pvu;b~U9;M91C0{#vNz@C;u(dOPMrW67eDb_}txb^#WRtU7lUY-kgm(WK zJGaa7i(yrW0D`B3pF(yUK~(d?vft+U4vNB7jA(7JU@9g{)0dJ1vooJqJG!T{cy<4YXHAYsc<&qrm z0Nb(uTCw5BAJK%sZ_$t;Yv8mR*68W+pc;En-G4%L+Xct2?!NFV zC#8n`3Zf<;ti}dShU^iQyKdw<=s{nk$5923ApLHz?@Z-Ufh3f8U9^Avz6ErtIOVZ{ zCK};cjh3%fVyka(3dcIn@BC;p$)W@uh-N+EuG3tn^aT2Vx<((OX)U4&_fnN-Pez7V zyU=SjS1Nk>o5@*Zb7x^M(Sy9=8~AiRm$1G-dR*Vqy!#d$PtuJ|-Aq@#`>DLpM3=6) zw@I(`L*QE{lL|S4q{0f81@H>-W#>d<>!;}xnr@5y_wvQxDNTxP^2(p(o1zCM1z9bu z{noLoP7si$@`cuYtwKZn70fD;i>mw{xUOoJlju#coPI?tQ>DRHUi^Qt^W!CU&j;Im zc78`oY2D@@4|K=3E=?o~gMHs| z%YS!D)aEjehLbZrBQ8O5pxOs@XdcUecjA)b5FW*gdPVXL^I{D<4!>JYE%eSV4J&>U zig(TaTv_fnU%q-|Y|E;?^~KE{i8;Fm9If2gzA(6|SJmRbJ(t_@?u&Ae1G_FbG+P=z z-L76g*t4xI7JjWZ^VtXf0RE2GR`Z4630pE5)J)A+2#D=PovtjCYL!H<)7TgdAGbOD zluDKx^+E}t0O_!3O%f?*3+ydhACf<~{|l22qg-zFT7u#JFD-T*?vfz>lq?nWC?raw zr9C}xQ_th#ilWz%OhV#KJ`ESTG%n}&E+1jqc-sS#o6uIjC`^P)TgoYZ&2-l)9kl3Z zyT&J>B*j);B38x?d9~D6fWODFEa?J;sa)A9@#XQ^b%Q%IYg%)Y8erpe zUZX2lEEkMgTB|Ur#uihl)JTBlPt|l3bK^?G8ou3U|YYby(QQCyyal+u#*;~#<6t~IIy!Lh#n+pny=YygAuotICzqowY& z_j@$k!m$ps#y->0a`{8&kL%JquHUl|jAl7YKHL~LS5xpk`rK#3%HOWQWKa!e7{99-J>k4?buedZJX$>>=Bu}!yM zKe{+1+$YmleT8@h@yaf@Z@v>Y9W8X3%P&!D;=0d|~g(%$s;{$MGTzd$b0iHke(>XXr>#V^CTRT8GA9 zD_Dz+K_7I;6OG~=?4A7;;0(0OdL~K5!dVB6i1LO8+gl?F_!l|yJpZh|gzd~d}2V z)rVg{@_O4T)Zx1H%DV6XcwDB zui<=rIG{5YTHAk%J>NUX^F5Dav=jXv^`3t37NA64Pv7A6D43u0LI@NqZZC4U-*e`d zrs_Vg?+a@>4s}2&%r5&pgS9t3aZev9TJrCZC8z3^%s2YIf)AN-SxwrhwHq>hv6$BNJ=zwrn}Y`X^boqiN=1)F zJ7(!IU7NozRJ~0-{YeJK4eP=DE7gu#3Sep$cCYI9E{Ue7*C-Eub6zYkm(M(KIn1w-@ zJru7c#g<>*c2@9dNosi?HExa$d#Wo5=9LExCI#u#y7l^EyC*2sxvY0;O**aIGh=pe zs$h(Z7{G`9G^ZSpY}!|LsH1v~c{t=%heyxb)U&oHXFrG>y_J%alebI?qh+rnoqPsy zt0tU?9!e1NN+(=D6b1Lb_eLV!$-z)M7VmpNy@5M>RsVXvcPq4Djp%ui{Yecxl&#WpX^;fa>?Q^R1d{+ zeBa_l89q4_;**(SUbA+7^;IbJ8q>0~xx(i0*h7>3y}QaiR3z1y&}vAk4pFL^ zlSwt^$PZ?Js61kz6>wRGJd&XeiOj?zk*(j`?rstp!t54quR#(@u4qFpTeld@0wc1J zYdQc@_MERXq%-LpDz{m1WFD{Hq;ClYhmuYv$Z{$PEN<7>N=a^DV#w^G6v%r;dDrxG zKf@=A2NprRWOi6-E*sl@=OVuAun(RCUMA$iSv-KOpWC^-#h1f$aCBq%2@WStJ9EyP z`hqgB{oWNa z23jhGE#n(n=!d9#;pz@s-%uy(!0j<%9T*$3$8!=mqEsIHx@2@;8A@TQo%NZOO3SQk z?)+785-kVO6YS@EntE zDaRbKuX9P(8K4cZkz#q*Y>S%JnVpQ*$z3oVD+G*OKIZC7SF5#O8L$F_SXF2b?i;QYHp zi7nJ6a4Tu5OW+bg0wSJc7`{VE84Abh$k$OGvM=hdkYnv8A?hQtfebPPJbZUfp};j+b8nw7}S zH~Nw>rz`Dd{4IWCEI^wrsCC{(+&zVQKx7RRO$R8RDxg2q#rF+>Ud_L9&#C`R6(+t0 z2ylhEDE*zZsBl((W)$e1sg6P!(s(P1kc0s$K2Wn~^hH=Lh9e;gxVn2)mHTC2BLFgK z<$egp9ao;F+I!cUjk|6hymMipr$^_~yNmYKy`^nengi+skDhbsOY4b-TkT}vA6UP3 zfmxhhx!>*%h`M)pD~23^5d;y}uOhnsf_3j-)&0bk#NBvBJh^iG%a!%@tVb$;Twcy9 z)bTfj@f=tYv|U^&`5~ADzadRnpZ^Ds`|{9Dd<#}iw)&879=>TgZnTK3-jA?JNfTa) z&Nt8Lb9^(hLc_bbk##Tz);{G_nUoTmHks54qyI`h=P)5CJj@vw2Wwy*W6IbXl$X`2 zYzA*%m@}B10+={{#)*JCQv*m4D)KQjqVtxMy)-q!U8m4L^M4zaWXagyK@MHZXepTvy{< z1DV5=J%;+#2N7kAU~iOgX28lYdWQ0$uK<1X;EnJySy!OHWBq__lN|iBHrlw$o0nAh zB2d}~;vg)Hgx+I{KlFU!RR&1o=GRAZ=oG2pmXm%@IQ19 ziZ{ZL>@#2eD)`Fax({VNuKROId;SYeczOl@6pWy)L+)-4zi7rg;Wjm=C8Ne)*^vnA>0r)nP?@O}1q$?9B87xA-j#7OMz5bS8T=-D){{)AW4kF$ zj$(a}rK7YEYSkIS?#H|ixin0DG(VtL<r)X~x@WcP)137qW|EgFWNNG(!t|jW=GDV*a6AxssV0?Czu# zm)@+ig+?-6Yew}_4uU2jQ)Yqu<7}!dl!gw|y=Q6@^0ic;k&mv@E}L%)D#6G;LPn2A}wg_UuEm4mIk3||Dn z*QaQ+$Ah?eH%IznH%gx<6bs2>S%O0QYR($;X$U`d)TB*7EpVkeSAA#3`OIc2rgW;A}UMQ60xJ12@mAHIeb zr!J5hIr4>pu_MFnndA1%`PP|T>`$*TvwM4cX7`(~E3*r!2}5e85H(WCraUe3UcZU` z1*FcwXE#7Y={2tm+$A)6{lTQaHgS`jKvEdka0d8sUWy_P-4``fP?$FDJR;LfwG)~PH zxnX#hdJTIP?i$LJiEUTQ0V69`1V2PX3AXF>2T1;ug}0ywRd{R|FVQKZH=LAkXEgw+ z_$d6UzeVftH@F6i{5356Jv&8kUuy=jBRu0T%y`wVMe+=}%dX9g*!#j#^yLk1dS0P) z&5nJ5QzG}wR^)^ceVOAbsTF>?qctIVG(+8VOTv| zS}8GcQ>2Ft@2<>TTPa_1r-pIfcGNI>!_(^zw1v`ll~G@4BuFZkySEeWw4&yxT>!*}l`uchAF&^y0g(twH+!6I$ro(Iomb zv==<~M2gQNNutPx5_#vnR7bQ(ZjdIevktOLm z^C)%$>Wy#SoYOo$VdiY}x+b5%=UskG;>d!#<2s*d=UT)wcxXa?@jm;=AXEo3wO#ck zazD@Lu!8EuFEK2=+8-XkrUI6THtf0W{0#_ID1JM3?wyLfxw)u2hRNGzI z+GN&Vdv{H1(-{zKtRyC?SP;!B6bew}Mn0Rs&n+y?AL;M8@V3eDTmo`-wsz%&<_T{s z8Nq)Hy7zZ6aWlu+%Nm|{8RzXsjl)OA_r7u=sV6zkCXU~uV;lW{&x4;M8*h|suAOVE zvVhNboH+vCj(%N<^Z-Ow_!80sy_@tCXop%`>njAeFkMq;LH$rCwm@Ick_RHj5U<33 zB>=Fr)wW}%MRnZYj>eiAqy>%%X#8u4`p!+%fa?73iWTuwkW^p014=^Z%{79fgOtU6LNu6hqb-<=9%v6x+MVFgpWh2Me_`i zun_!RQ@o@gQrktPx2tPDpmffX_1}?uoXU<-YuYNenATynNvpJw?y6*nFh#Y#CMnvmYt|Rm6K>gND{-Syt=>EMnPx0W{p*-?v&UA4ekHp)G z2G53nPdAb7ilTlhSWwkZDOw;fqXfN>N5sJIpZ=-2Pff7LRXw9hs5`L7p|oeWmUa)i z+jI*=)woX)^uW*UM}lsOny*0UMGvHwEdDnR7}Gm?$MuHA1x<|S?cJ{-ulJmze7)+h}G4uE; zsmW3_Yi?Zx2M!+F&c-&ZKn+=eaEldyK;~>HOKb|L3*jdI$2MinftDLzi!7(Q-xnofC+dazlKurbrfmjE0qlle;^_La^Z$mV2a=$i5G~K z$KRp21Rle8$+-)@yq9>1*!|QE(A3bmjAb^$4P-WQ?M-!3FoIa#5f`s$WJDL$^ciah1U&9Q|he)etPXHi!b z`glAv6DUsmG_D2s#oh3WqxNz{+JGj%g&fF#`!}Qle({4!xafQ5`lND3B;)NK79^vQ zO@f$hU2^?fo=@5m68`^4GSy$+1T5c@yc70xd*VWZH}acshcyyC$8o;4#u7soFK)Fj z$xY2AiLVAbHm#$ryTk+RA84lmp8CH)Le|l#k2m9IWk?f?I-0iZHsP6XOWH0tTgypZ zg+gne-zx7T?mKCO*RI&KTbLvPQRpnxhYl`VB5UxNr_gTKg_eq$FSD|ytZ~x`3Z&cZqnm=rH<;trNcX+GYSm3VN zVZ{&zUVyvEHg*j@PvUau=MX1-lkU*@-T6wjl8JX7xS=E9DtHIjK0k(o%d=G?Typx@Xnn;!+|zwD zp6|{^qoXz|=Lt>cKQ&qKlsrQkLW!$c&T=wmUILdux&qC9hUV6UniPpA&EAsltuE9u zK3k&KZE~zuGF^kCm7>=csRVTX1yxTXG1=iOz!I@kNS__f#X@5de~;74I^E`u&PI*X z@4=6;C!yDz5ZxIoYQjMl1izOq5_2j)Zx5=|J zJ-ahLb?76bx%u~8dyF>)e#xYIR5VU2)Yv+%v=1uH6BC4mrq; zP?6@$OL!FgjEgAC8Yj|dpbQlu^B@e-yk2(G2BGRHhA1|iYeFux4Q*^2c1^5@kgv-q zgR)4aS9O&!zsYX`q(NaZ1K{ZmdmL;?!&>@d@m?vus?<|ODt^$=JM7_ZLMBWKixC4Z z_}f@Epk=L9C8!KLN;ce*yD(3ZKgVl_`W#7{QR!uan&lHiospbR+c#JpHb;$E?))4{ z{ukD_zvM{R3^e>L>Xj3NU6H(3QyGFQS3};sZ=* zlu@fWGhI}s+~e`YszGaDsju4KJDQB;R@8$<9c{K%aIC)&iAQ>4?tnjJO{B}oz=(m$ zM53cfqzPZd^5{fTNT$&1Nm~to)*3DL7nyiQ@6g+stjz4z`Lc{#@3g6KrGX+zaIf5v zrH=1>99Xn8qrFR}Ncy|{Moj7?|D zihb){GP3@umK{?%T^|dM2gdeR_Qu0@&X@Zmq>$@K>k@IJFr1k&6wY?y1|+LEPiEfg zA$?|?V^pUO(e{ARjLX^KV)eQl zt*GC;^5s1=cg7Bdh+?-3*!O;I1@8Lc`Nghv4{JmxjCfZP6`gRgcvfnQM9T^PJx&>j zs(KjhWD1gpI8iFM{-acUzKggzxj&_9<2tL->|+P@74h@g05 z%Cyc2$HfC>g<%q$+aM=UyJN%HoFDd@N)9mSiCcRZr$3agrl$6#Lbl+V>{H5;qnk}v zxx#dxRcTc0B~BCb32zlF88Y@ESD5W%Y>v>!db>0f2Ih5sSNM{r%acPl9_+UNE#b(J z^=EYI^3=e|3wrFS^NJd;SN*u&48E#T)gRTx0-^OpxeKoH7jTzYwCXIf1*tPibeetV zsCSS@g|s6&^9^TeTb<*}VmMaI$}J8kF@Yd%h*}ydXnT#5m`LtOcG7mG!`Q)gM{u={ zS3ukf9B@SxTtQm6gBUHKX_3y(m~#0?A;t7==?7`8R%W&^{c(k!sM4eDQtnFa`Gh;- zoXT>nxnnY{GTQ>~*v{Bi?D;@Ai+1%z+y!YGE$pR z1|YK%VI!jLwpSB4fg3sDqPyWUTS<5*1KHevv>MuGqb-q?J0hi|(X>0#y6vn-=hp5? z?MoSj7vA@yrkw;`m--a{D#58CB>)@FYk8XeZ%=g zpfdZeVy0s{Q#Bcre^;&C^sxS<{H79NQYKxjV=;>RyMu}OJ_u)V)K%~o@I-7-_x16o zvLy=z#1uAX7ogK31kx}Sv=?&kChn=PCw;E2U@0)n5{goB*uc^Uq@SgW1M{UMB$h@d z?$evq_B%Tg+$vZbllVYiuY2vX3@1n5&GF!7Hbj0?S5783s7z)VB_(AedsLrMJPMeg#l6FA@{aeG7lH%( z=+2~$h93oo_Tf>S&=Q?}wm{IB$<6QWxoWj2_->D)l_t45m@?LWqmO{ZdArIqI}yQS zfu5Kp8%a)d6rG8&4*5K1FL&@}RX?X6InX(@93EN~cSM9?W1`oC>7l`FTGj=uy58C7 zRODg?PeMfe5_lF`xdDFW24Wjw#2x$@JvLjvAwO-QO2q?=Kh%-*d!>|)R5}=cU+C-d zqC071;_P@iy?4+a(fQZ~yP`}$L@8~u# z4kg|h3r%FSDxbXm{+L=|ExT381TR;}?Pj(=sIw3f!P~)phsgoawEI8B9*56LzV=cM z{t0^u;lfaJ@Ec+69uBgdjvW+E;N&^YE{)e!lF`@J8<l!=)%p17N-|L( zajRPEP{Vnvy3bIb!prG!uZeN4)2n;>u3XAQ+y<>lT|=83O)SV z#Rw}T1jGb_*wgUY-+aCb?Q9Sss7KF`fJMI^fYf3LfqxWIOQXu?4Y`KA{U3lEoex61(CaKqW?QDppv5JyPy*Xfg2K>p zbXaXu%fS{7sKevOqz;ogV3sDMYIr6}T0tt63fgXGoc%6?-5^&eabG&1)iGwZ&PZvr zJ_lQk7~<~qP7rPPN}uys&5S{dyQ6BSwtIDbN2ObDjc6-HV`pjUJ%g14dpompQw6*-u!4rqg&2|P0S3` zmy0WTtG&^6uYogXy^XsUn9#F4}CSIRIQ{TcF2#o90aAo*{*__ z@mZLFoY86RY8k|xu;eU8$gcg|v{PpfX|D@LdheU49Y0{V8LX_?Mwx%{{ZSclPE)QO(FekPN9^DN8f3 zS?(i(DqpvQ4{f5|RiX&ug>OLwF=b4vu{LMm&5bGQSsf5N2U6FY6k`O*YKjs22vVm6 zMIHSp>R1uy$%C&g{3ztj89r~mqqcoCGB%NSY$VWG7OTB_Y%(~IB!UT;Nk=G2iAf>N z-Di*Eq0?$Vs;vWiCID5u#r~2dUeNjEYL%wLVbMh#+$m(_j02NmJ|7NEx=S6`du%i& z4h8Ldq7mwQP^O3lhG|Vlz`zzuuI4sda{)|icJ2$iNGZu#Mo7H}>d1LWeFvhRAUOKZ zDH8c9YUR#ggvvddF>esvk=NNY4hxJ%dUW0_G?UMvuj!uZPefwe8&T2Y)0VNO57oT)bM6~Je^{BH1S zzQLp)vxa9Xk}EB*&IW^Ju`&AT>EiO&`{- z*tfpK3t|+ZDnU;yC2O@SAJZ6!74mtn`ui7u zbW~9EJ3hO!@5lg#gT{qkq>M08&TL2b14GovdPL*pD3l@!(J8~M^tn?goCHFSMBnY z3}(N@7?E3a8k<@U0kE&)@_@wY{+L9c-_Dm-QX2IqH$rD|;>o~T6e z#LBku#BIcNyZBzbLurEy?)dBK-eWWdZ-Y z-6MF@(t_A{o09xCY>t(GpRU0O@G-Jf~R=$6K~ zyQo6dnT3#!RVDP(3N>ZO+bo7c+1tKp_a@@e!XHVclMP(;6V~alq|2pry=7S4K+^z9 zOMwtAa*lUt(y-;kwB%$!1j6RgtiB%I~8lu{e zGPR5;e}z<^qK7rob4Qj{(t z>R3&_62tUdnksh-y2!~SFGNTz{_kwZqD zQcqJ>Ft9+4h85cHkHa|w#v%o(9yTsL;Td)g`wGS5cQl56^f5tFng?Mlx>vR8mv7#` zJDskcYvbC6bj)EFl?xBP``zB)LtN|*E3a^*-ED<9W_RDpj(W4&3F@!4k0FFq{#}M0 zW^%Zn@3wnCfy6~umG%N(E){r|&6)jy4U;ZExd$!vG$>34pR6}OuckDGuf;+1WquZl zEtQ5N{tkyG4>T9nS9O@-z6=cl0Bebh%uw>)EO48V&MGijst=-nXR{NCKy{V9Sy+|{ z>#cX4QG!zWf45C!hIE*rH5dcNc9Vo*;Ly34f7t8`(HgGv<52S8c)Y`ei6&fFU%%WU1fBA)c9>9L12w{yip z`u1Q+>E#5hXfNUJ^k4b^E-u~8TdZ9D=y!m*)vad3i{OL6^sovRjV|7@O#0%*!}{DY z7iJ%r4l78hDlL31+oi8UP{>jFmjUiOS&Sm_v9-H3UrB{XjK5+ejV9X&^gAl&lRiig zCfA(t^Vo(tF&Z-j5l5U0^nnN627eO(d@%ALM8Y5)Kg_ms@B%rJ4=ulM&oWY`HpWY> z+8=W~-%XBjP*Ld+qz%mLHi(L$T9R;O)4P~1kRC_y;Qmk!JlLAr*{gLb%Ai%DfA#uf zbZnU$+H?+at<&@|i+CiFe3R2!mZtvKlY(0FTu~k*s-hd2EA*W)%vR2wz|sbqH{24m z*US4WP!K)v;6WjbSG+i_mfm8qy}}4zP{=l~2uCX0O%sxZFI8IZxOO=x_D31SY3x{q zxO~*u{*tfjYVj=;d|R)6(SsQr>Sgv=hk~wRqz=^cz>gk0aRRNxVq~7H*O{wHdr}Gq ze>@6bHPl;wKx*u|uYlkDb!V&7RK-raN1)b78#R1 zw#!E$CHKZ*_z||L+wE$gfTTMK=-x{~sPISrXTKUZq2huYl^Ff*ZYh#b2Jc8A0=E0m zxb;q#a`3n=9ze*E&1UVTTs~ z4l6gf>tAj^L9&Q~vKyKd`X~E_UIuLoACSMi<2^c?{DpvIo*hqw_u=Q;9*1SAXS?;S zK66X2alS0AM$$A&tasw|shFn?M%hwh zd7y`ApQ%`gAeH~?hwal_(5Kb<2mY}HoC3CoUQmZ zP+B@Ah>Q0W0b}CVsJd)>-^uaEtkCvYr5}msEXm?7HFJtJ(HTN^cSWP{U)>BHOKYyZ4U8r{g^l%#hH@F$Qo09qv@XYZ*NvIV@1s2ch=hGAQ2JFF^$*EedR8JJDdFTtx*AEQp`pLY7&dj{a?jfAm)b`=3&jU+IgK$6FcOlXbCFFQ{_igFZdYv z9Zy%s0EheHcDsyLSlTg=XS*mEDt>T%eUr6lzbG>;oN1thqTS(>ctcLh1(CkFHrg>W zrA`kdeaT}BhHH*V6B~X~ei7;7z(kU+Ng9;)eg0G;fdbZYP3W0@mGAK-1Dhd5|~Wb zQsK~po3)-^*362xFf7(*HgbJ)&ukzI)1TjDfxq$aHY2_Y^fWeb#6zcS3%T-s)f0}a zhv?8|8eK>rda}UE;8CaIm{>gl1YuWaB!sDf zsPUVq_#K5XFXAN>urK5Yzl$}6(4Yb=t_I2H{HFcYY<(1JboldR%zQ^GtKY(00WVC$ zFIT8IfiC>}Oq|y&(EW1!rEKeu(#J@4Z#T7EosTqFGMgU^X)-K&)}@htHORE3Zr#iB zAn+zB)|9DFU53tEccm(02H@2Y@ET=VID6DFS3hGz`n~T;LeoGm54pP58ul~t@%H!0 zvzhGdhxiv|pJd+`$Tc_~?(>T+ekYa&zUex04H|kQ)B~Lo?pDTBKSDiohiQduN$!`l-*EA z;}XLLYMiBU(^cSz=>DVdob=pKr9OfXg5hdR5w(=&$n%>>2X7K!ymLHTQjfeyHECqkFIgm=#hJQ#-ohiEyv9nB3hF}! z(QyN&2^<4Lg;?Dwo^&f=9hzE0mkMk2!8VeF;rf>gUyeK9J9*zw`)IEXz9d?^!dzn6 zaZtm!xU*zi4pmD?rPAe?spwt$ro}zRDT6{99)aOKQzjD=Lmb{#;YqNDvQ5SBrE>kh zHJ(U*(50|PRbvr&mW}csT3H=^{L(~rWItQ+k;ov*!GO7yiFur8krkPX6e=C)K9puOzW9c_dF7kvvsYx+y9 zMB#P~bYT%WcN?j)OivrC2Ds%#^zmTnzuRjseM>H=qd#ACe6r0@^bWC)(tQ=K@Wc`k zzEAs<5$?b^7d6Znh5I2!hJz98ZZn2WADX~$7yWSR6t++4c)Ite43U0t1kn$lbJ02w z(hwa2LIAXuV&nDj5v6_G-Dam(dJ%6M?-O7jc*ZS&)c7wq7VInb2R!47Z(f{@$bDRp zN#J>0nEM49+b|9JYZUVkC#nqdAS=rR^RP#?L$(Kox^cLPs=7%u5pkbL7z(Lez%MGG zu{wox3~!6ah|k6Exo^(`@uwiP;Cm&~<|Z8^8L%yO?*!DziVhnm;*%P&ZtVZ-wt zTLuIk1BC>)trWb+RPtU!4LJ?jHLlARsT&W=R=MwpoFh&-S4n1w*Bb`n@SG=UyKp1eNeiNsU?y0ZD$b`)!3}Y%V7#eL$YbCgR&Rt z?7Qt6P6u>Xn+0U!s+F1zw*3cs0bBk|-=QENx7@(4&0U?=M&s4{n$xNoC;RCu-AZ|k z!q_AFuxM1O17K;TcnXdThvbl0_w2dQ%(zKI7Chg4G9^+LK z3b0C9z$A5xEx0SWQ+o)~RrvetagZ4G0& z@nvV~*X5}AO}aN3NGO1M!E(M_sYbAnd{VQ~GP38oQYTc7$^v`kiI{@0XIDi~K~h6B z)fV7+f6Spj6K6mw7LCn;j6hC`emo+=?ie2{gjR@VqEs@O#%8t|AS#_wrQT$^5hAPA ze7@Xd2J#mckICkAIam*tR;%7ECSqUwgQ?E=Ed)2$=QO44mZ z(oNHCV%iSU?fio=G_1pmQ#5RYlT|frqMH^q>;j|N6$JACOBnxOVn2%OkNICBcaV1n zD&>$zeKGwh_bol=y7G|s^1t+cUB1+Lfneu3zP5Qy|Gs(Kjg&U}OYgalgYac!nD4r5 zI&IpEZ|2-7r6CHvC{YmSRFWi!dQ6fm)0=vPcnP!nF1f~MSL;6{<$ITy`@W;r^PEk@ zNd)m7LZ9e~U4ZWSsPG2_6-4V=2;uqOd=YNL8_YN{sV&FBYoh`a(h@U?cj8Md7g6_7zdhnNDP|*!BK*>caIb+AKGkti|Yf zJ>YXX?=6QbnN8`mI-~3AbU5JhZL~dZ%_biD1#A(2`SQt(EE~j5eO^{Ixar4t*dLK$ z5#iDjQj+5%W1}>b)KnFJ%ge0HEiF!uPL6T0aIiDeGSaowH8s|jS66sAxw$%8+uOX{ zJw0BZUfzEMgr35F_NX6v)+1-*_c_>Za@+NGr_0_#ifP?W&)bXsQU;Lk+Y9PXG!zVE zbkx+iq=c0ClUFdxZK(3JiBp5)^^V^^P~N5mIB+<(4Nn8Jery?Vc~tA!0-1C8h@$DXNRT{Matd zd*q10U)d%YZ`b~wS4{sCJir^!TVIIA zW~J%Ix)OM%k#(mW zV?J%Pg2e`Xx=WL+)DIaYf@b3&T{~zQS{Z$4ILZ-9eLIWrmPHh1(n2g1WSOn)cKb~Q zB>7Dnij76n_S4fJiRIqq)x2rF5MqqPT%m^dwmewT6;M=P@ti0nw(DZ&d&MgPv8;xm z_I}sOJF$%oSZ|qKl+Ix$xibtQDDZBJNa*T2zDew zqxYd5)CMtWM(fwNt3&@{R`legCkhSFnZOOxnau7`lP>Miv*9+GuU@OGSe)li@^a!1 zk%?nA%&W# z3C&j`HO8Sa&LA^pzZ0WUp{7hPn1ekoNLfVN%&ngjP2dgYgExq3$4jZzY$-iPsZRkG z1K{9ufn@p4EA+>T?Q0D?PtzAymboXZX$F_hVVNMru)fiq=@9_oErF1I=P0D_W> zrG_g>@Y5nrv9sQ(>{4wGU*D!2$%j_YF9ld9bsTyfz%D`*n)nsqGZI+Vf3V;tMoc2a+9G|3x^*xlq*x! zDPbw=8`;GPNc}4ON3O$SJc&ZiQe+d7m^xY-sDin?@~k~MCrhr>f~{e9 z{5;5~X+s6EzS}Vzj{=$>=k|)f3r9s;tsbXhTl-4j^zLP%9oA&p8Tj_-RP3*&-W2;_ z>+$H7F`QPksYqYytDR+R)Lt$txsGqbPbsz?u2x$D3K}EEeOlJrv>7uXn?uFa0^W7o zns->eHkS^izxbBiV?JHRkgiHpmtd*Mw55?TX^QU@945frnm zGo?b(a#UQ*0TZ5FXC(Q8sz!IVS(dI(=#l!gLFb_ZU;C)6_N|>!xN;)7L5} zi(t)o)uJY%D#ohcG~AleRSWA{I!9I2)>WKUj5j??Yr)=Mo&!dNZ^C#<^nQ9^c}Ni8 z-wcu4UEI(+KWne-MUo$G zBwV`BUt@<4`hs;;N!Rhp1$*v)ywc?sIl3G%DOQofoZG#(aT%nt=+=oUK`2D`am9^y zWr~}{h-*4tG(pv1^blqI!DuEkv?tS>Bs2JCf+#b|I>F`CtIe!7!R8bgE$=2W@WMXA z1ZqZglRA{s#jqenT2#T_b!PKj+7PzqBTEprrZqcqL` zZ=XA0pen;`-n{FBx8k9oMFMx$kN8F#eo2L{q5kMywd_K(xaUG;-bvUifP5+=USyYzNSi;&hq=f;#6Pi#!O3;(I2kWa0wB&N?b_qu3kCf*ruoj z;e-$Vh4uBWr%7yheA(7A=kFWJ5f8g_9vtAPA0mV?fJtTxkA4fKdJBh-0$eA6*^Cni z0RgSnM+Tep@oIN>XQ*}uM@PlT%+yd@U*}}+czdZaIt z?lj!+YbFbb8 zqAkO#H%_ludNK`D;&SBK?Ay0t!&1&V7j&+7y;R# z9pQj=?Y)g_j}w|*Y=L6Q*-GDg>ezCuRnReQg4p1o^In`%85Ck?E-cN?@KYZr*&-@Jn5#p*rDM5MRJr|I@?gw>sSnJP4A76kx_s3^ak||6Pz8K9& zvMvTq%aDeEVo*|%mwa$~2ZMFPBD=n&dSF-IQEQ*NwDxA&ceL!vT@JkSg^ByX%fGVb+;Vju zMY^vnU4__f;e&d;x?_>vf95_>bzez)pSL`X=3Yhi1l3bUGRdcOsxwPVRwfmrsE#Tk zSecfEyVTDkh)3YP#lI0_+WSk;pBbvJlL^u9D^{kuZh%2=mpJdxlnwHS?qB8?q3rR7 zZ=kPgN+0#7>(h!UF`2MLL*ht`mh&)UCgAtAmnW=4)BlsQM9@u5O=r3`YpPG)3H!nM zB`-?=r-p_OCAW%Th_G#Zn-C7?CtG~V9A{%gc28Mpne^bY1`0f8O!0q^e~c5jLbQ{J zQLB9h(m2P4Vk}|{)lQTIk@gHum8Xdjp2JE#BXTJJv4hR%kd7%uxTLnv8$q?4C!tZt zVMbd79SG4z?!#$1yGIg}@Wha!elakIXkC+%-uf3>gowB>H%(Yey zx9`}dYMa8d@9Ux5JmPc{(Md))Vs;b#wzt(sFH7LE;#f-KY*Gze=&)XzZfZZ*?!dLM zqEFqoMbbL9UNUfcfK#>K-B7lQ6F(oZw~uOCp(l1*jUrt)YynoeiFcrG9AB&xt=%KK zVRq1L++V2bg7n>5yk-CwISvfVM^+d39hq{E@!7|4ZHudpT8BJ5(+nrtU1EW!4a-v} z&XWs<(N;|l^$mU{(Qjv59#c2>+`rvs^4sCQA>6b*q=HaCTuDL0ZuS8Xko4r^JNVcW0%R(oQC+blJo08>-?9JJ038B|V z`%o)~CUzIn9HR<;;Jwny9JMNs=Bp0TAkc@)pW01V5ea0Bzwcl#aJPaiwzT{8dHemGjApz z_4*P9kMPaPTkf)O7`X4hJ=dS=RAm|TMf-!o=$G73IwxVOW(N+(j;q$K0dF{cr|~_m zJ5ufz&6_?;`(R?4u~c`GRNMT=g5HN|7VUl+=p*>3zG(`nad*{Sq;#^0%bPsum0ctU&WJ=??Dk>+-Ok8#yDCwU#_D@^NfZ1M^yPNZ~#eRV(o-bDYz%l4c`Af9luBV@W0!0{x(#~u;EsE-fS-XkW2q7*@nPzX@8 z4raEF=4=+^qW&FDty~D*^j8>wGXvK(3*$43^gbI#&RPi7VL&z2E82?nxb4sxs&`fK zw@A9~F4-4I;x+CMq;fLxuS}ZTm*JA0T14Csf1HDKE|6Qa;FgY^hicd4I1<|^%DguR z=*rJ0-k||>re_-N@c{DEOK^9JUD|f@nRljL;+G2)_ZH{C!#fWjLB09Zdlw%i5YX+; z=Usq*QT~qQUAt$-?%qqD_pmJW;QlV6)3Ii%;t{8l?`N24IVUeL(V--<1ZtEaLje{ny6ECi&4W>Oz>Fv(W8kiU!7jC3WMQAESrbj0rXm ze}u8><`Y>E`Jjp!@b19A98W%!LFyGhoMT+%CC*6QA;`BJyvZ#T>4i;@j^o~qJAWBl zoK&&ivyVN_a6GAUX}irawTtRCWPeEXTme7t1dLr0$1G2u)@AnD#>uB_G_)Z9?zhEX zURG9T!=sCt!u;wP>3j|$!r<=j93h9nn4!~1ewb8I@Ub$nzeuD>D@aqtFQPh8U1r@I znYbC-h412yqG#6%AH_P}to;c6x_f5*#=-x<6JW9w0-C6%VX+~MVY!(16s`t{gbmI< z`&i9bG&y7UTC)cu)9=G)0gNo4De?0iZ=m;dQ67cMseWEqp1eZQPa4efT%vZW*@426 zeL`sY(qSg%(#}K5#n495=0De!*rQ7R8qJ)U*}0tRSUX*SCG#N4n%wjw>-t+XN;FAL1*Dh3blKnDKA&ha(R4cMCL9LAXrTj2K$xj-PXFfM3Ocw2poCE=j{g zx)g^CPCc>2`0}%TxE2W70YkzSf7j9zX$M$UHRc{zZG;njIxHb}c(H$!<^`$#80s*K zfe8Af%OY=+zB4x0fqU9wY`NlI0UGoA>}ik(0Ur8%>JS(KqWVlvSm{1^-e0{@ykWg@ zyrI1@{Bj|4&EBA{M2GYWz|2puPt;F1Pu!=VJTUna#uNJ!;uAe@H%#~R6U@Ggw#1jzCfUAL_6v{`>k+ z>OWNd7xZa1Tl~-S_Oh;1gUv}K1Ylji@dRdEp~KpW9?Xf#nxm&8g_^Tr)C!959FwId6F0}%heXuVXc5YrM5WENZyl}lR;Yj#PT0`lW zlI2KgVGm3B-&ExoGVG{i<1?MfV1#mPvKO^z5 zIO6*dd(Zo&d@e*cE8o@wSK%fHIgT6XI%on<&!s(OFFRy!|M)~0q;5a**RSUSm3LIA z3!}zHZ>x^}2h%H;PZ`hDNpMO}SX#yXSB)YyCOheJztja|#+8TK+F9ACE&S{Q+{JpF zt}zfs*N~hb+=`PID0E=jC79tl=hWA)s7ts@3Jo~!IJf75*Y?c@A1|q=^xvL=>_o>`O*h!f;gNW27SJkMhqD~FQD=){F zx+@WR;$)E!tqZ_+CuG57PL`Z^WYWesmM)UlBmOjes?`e{c!SWeX=mbttw1A~m^vBG z&e$}dnu{L(;@i=k^AVjQO^q7&86?ZS6U%~MG0mZ18M(+6R!DoCmV=7NE`6{v>yK=& z<f_7fwnM^YG@;%Q{l($34y;!qkpb;OGs91RG&uqjKRi!l= zykPG9j9jpd8u5O|cilY$d{;9qG036_!f|tjUhC27!gW8BcveMg0$-gO>v46A;%U&r zjB*rFr8gR9SEeG=E3l7F-Y}HflK0g44Rou;xRka!tq)!>*p47{Aak5#&^yt!OjWrB zcdTvfUPSMhJF>E65KM+`;&$#Jxdy#ly$po+&vMm`8)2!MasF3t#Z(kvGbVKj;=YV{!=}2j`x3(@AG~0yba#*#P2*Ytu$MXx+45GJK zCR|lS$)R|7Tb{#S^S%wtE!JHFAI5I3o?PrLRJDia#2+so8T81LO;TSbDux`YLE+gJhHRXzIeBZSaKj zT*43qZkk{Z@XKIRtu;IUbiD;;wpy@8{>J2NZ{bjtzb7snX%((EvmNTj+A6%e2@I~^0h_e0RV@1V*cH1LMJ(RSMB^?S2Nuony4-3J*zaMksAkPmg>4~WJw(JH#f z{8PKgb&w++qglI|J{GLvz8k&N_b$(VV$6^^?px#0dkwXenc^k5>KvjGvE#8mPn--m z`(`6_`lthHFgf|Nb1&`;Y*epOa%dKKrz#-tL<<=GRV8%E&N;NL3KJ8tgGhB|f^cKssUw;|bs3s{@Kye& zo%6D|GkC^U|1?F997|sRcx|e;nS=WLbOEkhuvybt{Gc$rY!j)K-z^gO;Ik0KsG%by z>0GV65s;&?T}@-zdxHplcvXtBR|-c=UMSP~Fcx+Fds@#1v~B&{;4lw9F!{KMr#)f} z8hdg_%aF;=dxd%b2vE92QcT1r{S&C6-t0HDi>`*tz35%`s@7>BHuL8sxx*&yGdfv* ztjuGq%{!AhqC$$g0@}u*&zj}uze~4iqs#_5=13bWv^7^|+m4EMZMKN2h6hcz^A~Wg zm+mBke+f%S!YGhYMYBXKmFg6sOK`5^fao$)e1HdY=4z9ysLP8B`%+J~7yop$%?z?v z2Y0mNl6dFBJ1D^`m*V6iHLMM+qUhU?tNa$@R`yCq7#HQei;4bYRfdto@T&qU%MUN$ zfJA(=nM@EZmsd`Jp9(9J6!~vf*ZdqGSC8LGJ47Te>!ms%jOuA^w~Rc zlgb3glaEt6K^MyAFqQmMSL(yW-@BF#<)KK2Rhl@KVKXU7r=F9I#x9Am1DG=ov!+{V zP8hKm((r`WMc)3<{%7(q-Ztgi6>bm7v0^ubIk7%|JK*lG_M>x%XTT#iR^p1uOR_#T zu!wU&64*E^7$VpH-8qvIKrY4rw&w;@|5gxjkW&*v@KWmM6z*q>=oA|V7Y!Y^t<~N7u|SYx$~Kb*o)7x8V{p z)s$N*{r5ysM@%mD6vwh%wMAj+ygf4HVo{j&zLub{c=*0mN&ZB#GzX~U3hK6R&sjJ% zz7OX!N#>g~gI_p&$&!2#(qk0VJCVjXqVXAY^r@=BF0{KtD7>%gHmU8NbAz9Cz;}BH zlH>GJq{y~W%4|5dbbCmW<66r{G~-z~woYx&I#+FJ0Gyb_z06Nr;LQAahj|~de=o|# z%Fn%LA-#|Etpk_qo%bBOfe(=0dxhT1_%(`p?o!|F-fh4XVS~g$-=&3k2e2``hqluZ zEv98gY8j1%Q$&d|9Ur_$*5LBbl-ZQuGd=%$u?x>RnPZLpWu%V!$Q5jB79#o+K>0F# z`qfSL$90&cz1w3zGm*3ZXT;+e^>9uHE>tuW4bp1kE@)^0eCo}(QUtQvZe0Ng9LZIXJMe*N!yp% zl0nFS`@zKuvjJbg7$)aPQ2HrT6|`Bi$(rw(Y>r(Wz0l2)M+KRi=Lw>-0*j#nwHm#B3EHz9u?)_2!lG%ShI@xB!(erwZ7Q0lpDv~Z~cX;+! z@m#jDfSfMhAd#kcug@mn7%X?9IS{U5PAQcuHRT~AiA&$1U^7Z2W?{*sE~u0iiTK|#z)wzx{KETrMP@(0{VO}+h_pE* zxN!W`hhX>3iRL_x)oB1wp8Jx@Pf>tgpwLD{(OzBjT$_><+oG6h)P7T`DcL;YSQ@)o zW^ovU(jyir>xEaQ*v(ipaco z!q_h+h85ls#bj!n)(g|R~=O*_bwq7hS5S&O2lZbG+N zKjqnJ5IE^RiJ^7FzLvpr_USFyF`+1n1f5Vakv)MJb$TSBsgJ-lck2K~z$KLQ= zNp6z+Pzanb{`3!BP0n$$DPGHV7XW%D$bBA_?*Q+le%Se1eQd|RrS_=44);7AZDWAb z8LT=H4Jp4*U--6md?w-G4ke%=IMGH{R(e|WuYvD2wDM~LZwqsw6A4K+GU{nSkO;?K ze5udP=n?=5?I=bFHd{%i&f^E!6m9WD`hL>sA6V)}akAw0f(U9g6(yUl5KX{u@vd83 z^Q%g+j7pBVo#U#;lLXgQ7ik#$sk5SSu8q5sG`^QcVg7e+!#F|lP%OtoWU+ORD5ghj zv-KDF22Fz)t}2%4fDp8$7}zp)HI5p3d`W7=9-`Z;deJ6kPgW$&=4KW{5Ag1`&s&iu z(+7C5QDL_$g_AmuazoI3IR;f5>0nYH2&U6534j$*8vNs&+s) zA(@lh@!9_KWDp&;(}w)PXs}-;_q|b$nvvCnzn7@YKl+vo6o$OJ*ze>pEo3)M9iuUt zp5%Y0)oiR4Qp#0z5dZj7eW4<_R5dMSRb^_l-RbM>4)wI~Mts)4r#A+#U57e0t3tB_ zGb8ao4$;5}x^dS1ZXKkjq;}o@AigO7%5eq*R#D#Z9mO=%irwJ>-ag$9wn0 zQ>&djbkzVU96BMj3JqqOZ5tE)Y{>{W2f#1WgY-v-;dPEUD% zZkpgQ^A7M8sUdq*#b+#LY~+u~fyI6H<-e(6asCc7dYX^dW#TD;`8Migh zYM#yuh{sFG9RnvPT_{H{yN0YGKP(nF<-+YiEtk@vL$`n2apr^_2}@>*>MW*FVrEL2 z_~@acZ(+)a)bKo4^NEx9+;M$;5}|Jz&wcmAPn;L;409=Jr@y_z{~xIAkwtg z18>)Qh*OJkDiQ1OM-r;u)#$i@B%ZkLTo+1r9-35Llt>qarGZ+<;C<7LX! zjpAkE^^%{~jq+JLLL}pfkgfe5RpqV63_lYfd5s(S0`K@U(7K;UYj#+7y$;e%TMRE1 zd6<5n4%gvK5U&Gym|(yG+d*3p@9|TyWxxT+!CD-T2YFa_zyZ}^T?9|<=P+Qv0m@-r z7;o+W-Ro96gkR}^Y^D7VN3Cv1r_ur6YJCvLtaiwy(gE5^dl<*cv_5Z2KDEBYJmyCQ z9$~wi9mZe!DNblbn->L@MP>~A5#d~JpB^SEgwSs|Lf_Ei zdo1=Cgg=<~7{orx<9dunK$JI_#D1c>3M6}WSkICF>G$(I$s-`n8xH^fT$#zET$oLp z&4wS;^rs&2@o+|D0IfbA;i^DBlBC28{)@^4e10Y6j{<%#GJY>Y;=JR0tjk{!Om%$>14% z9419iov-#y=sJ+ZLHUWUI%sX=}FnsBpC9)pIss6cW{5QLsZWnD0^+fyO zK0`l~Kg;dC%5_V2lRj5Z;7;%`*)iG~ZKiwR-a_A!-_lRKPPO%ZE}!n!*5s6V6wU>j zB%7iw6D`fk@ylF`SN$z!425RN`&$6Ms@x)VxK+e)BrbWo=bfZM0xP``2 zv@8Sg1_#T;UfGrS2b|+k!`|aRp)aqghD-6pb#*;F&W&F6d->F7e4fFpE=s$rU$8Mx z-pfn#%iAknWMwB`PrOVNUdcQet-zm=gijD^_8vdZN&RTKqBw%SJU!y<7v&J@0_*s~ zxoP}$gjQRmeJ{Qz>J9U7Vr1$qf!+4%;`!A!8I15rVNAlf052=dRETM-qf|&S(l1se z@;zraw1~BSW3pB-{29AGR6QXSExzjP=+I9(NnbjgDH&~lXu`JbM%o7>Iy7Tybr_wM zzAf$45vl4`_xB!FAxJ_m^DD0$4K`63X=5EWGO7utJKr7uoGZj4E|&e#NG)^J7zJ5f z<&tv)_y(vFgwoc$Ni2M`MjBo*WMIUBuXob+5Vf9QPQx@03uWmi7v5?pwPD(Gf}2~s zYYPX|qHa@Q#Iz@W{JH63$JYti>9_d6B7k8fOgOJ`s`0<0euTGzEELcrSq zS3p@!lHVksXsKP~@iD03t>)dUybYudZ{EATg?f`5Rx|Q*qw3bu6yJngnxz>`r7ok8 zPx$uxcg}n=$5FoAJKsw(^Q{Mvr~w3ZDQRGJ`~mO;Zhr0RlyfK~6Hl%Uu&I6Mtin52 zf6-Ho@hT|3i!`?}$d<^Iz8@Vf?11}-?Q5X`mmb?Vqh-|vGhaRsd1Jh^o}q*bvOuabewS5o!=tn%p7~2Kc*iUMyfneT zC6W8X6c{4|g6yKbtPH*_8muKxNqh^&yNN*xIs3I~ce)+1QVmeiP;wl$^2O1_c{0HwYhk_C zB*DxQJD;-NxT5|y7Y zc8WbidePseKiTiHMTZ!y^xUQV18}ZlU5z$=bs3_Td-as0ox_o&+pSf++P46DjV3`E zyFwW48J@oEYOzbgqPa9Zn@l6%7hs6$#QJ-CG=u=iM^;uxUB0B^UV-LzfLW^O2#-nRbp~)|WsSt9!wmV84b!8>~5hXthQNhPr zo2~HB@}dt#dK`qMQJ_KHV;xVyW% z`@w>{I~?5M=f3y5Rex1i@9gaCOxM)xRPR*x^Aws$uKUHr6BAmQ0va^ifAg=pEQDJa zPEOc(H)-OUwQERFKn`2MFSG62&Nt0bE_0tjV$$UE$(j`?96#C}D`|cAN#u&Nnt(50 zPa18Mvnr}^k&H|cJEkRgC5UHDc!XA{^*awF=jP7%3*P zO9g99Q59)4WF_LLez;v19*@Ni?67Y%Mp62H4L54S)ldRKEOsn0{&NNduoTgbch8d`8vQ&ghTG&G~()ac#^ z7Br{iL;jFNk$Yr ze+$gCRQ1%3)o80?_b8&QwaH~UstH55pqrO1fBQJ*hd3h zKi16%&9Ee=_}OWs)S)})O^9+*y1;wls!#4l_$@PvsgXh@>RT&+q!rIIDn(|ULYzF` ziEL$W>=GJT@!6ALCepiPVU~F2ojdFB92OZm8ZBNj%oko!}_(uGZI0c8^Tr zP|JX%HebYl>8~*R(}H-Q*v8DE4I!|@Cx+*NTCS?b6ciCCkht0IW7O*p4?%bumfAB?0*Cx5; z1*E`#m0{sjhm6J_XL=A>>+<#V_^PYCbMOJ-#nGjWL?p&Bo+Q_AM!JXF5e0aU(esd5}_?<`H~&@_P)CA7JDpR%Bo2qjVGsT>lsXs zXbi_%3)g4lm9n&?{R~0Yllyl80X6KgiV^$j_ISGN?1uxNEAO>`l{ax!1FlXany;H* zsn-8of?xzxlgSKp6J?Z&1oFhXTt8~K3K8_kElr3q&)Nn$*~o<=JQ&YKgN=F~_f@3Yoenl2OI-0QQ$s&4UN4(Dkibb?Ks)q*jTlqZe0Dt~{>#Y@(+yajgk; zYTCB~)=_ZJh`k0k>6os#mc4fZfc5Y@=R3Xv^zVyup6p$sUR8^Krtbc90)${L{Te^y zG#)PlxISzmgr!KWf}448)^bq_$RQ;xhV!N25$vfNPyB?Izc8ltzxTR~gN>+BPrx~s__Ow_9*e{X}t;?Nne&5g) z=xC?!XxH&-c5`)ibCm^OXl<=?^tO-pw_9xsaA+o`PQA1cS9r47njo1knr;l^Yz%+u zw;YM|9~UGrqAO5i4fsRnIIm~cLpGk!k55rKr(Ct+V*++|ws4`o2<*o=DJ|NDI~P#B z8>nz?n3NZcDJ^`4J2w3vpnkA@bKuLy7o1mGjn-Ae{R@cn6+}v3rnNO)J4e@^iB5p& z1%TP{GAP{>w_{hmf4Y+}hCe3HY%$*qEyqk7JYJ8FvKkNq6z{(nW|}fxAa?)Cc!|?- zV{LjKN4Ryjfl&QG>DI~Bf7%JFcd5pIXDv=f613Y68-2;h-Nm>4coDGMj_E6a)_=Q> zI`^QK($(C1+lgIt31s%R4L6k#RwN%V|6?y5_}%gQX{-*6x*NXE zHjiDfSv~3~DPBL)XG5HhZFg`8lPMs++yG5KgC~~9Kz(QZL@Q+=iaG3tIV{}(3~`*xzuCWM0g91$Rp0WtrM4rib$) z6v&S|^~0=>CoAGGhs}^U8@o{qC`I#LtJEZMzJiOS`I4zvEC7YuO2VXrnU6RF(@vnT zbFQfV&qTdnQLm?rlFg8osb_B5!5uMSA3|PNy+>CsU@=$PfSD<{cMUnvod)?}kU1sY zkeMmu|979Bq$jsGmp!X%vT@d*|9B;xMZ$g$ih0u^$UnXV^ zI?x@XoTk^fNwT7}A!NfHqw|K&fK5Kn^}>JBi@5WK;}%ryH^(2g@x5kEH$aa)WwcBjX(0Rk&kz83ElNIpc?|58VJZ9B<*A({d!CP@u z`pDUy(bb;ZHpT-h?Vf`JJl~OyN?e$o6VXVxR#wiOdGN)Q83yl-X<--pO(C;BbJylhq z>bhvjZN%Lo&R71AezH9g3Zk#swfqykg;k-_nZaVZF=j1t{P0o!LYcweb0c=2X6|C2`Mg41pB#YLw@CvAAIBQ5@y-zi+`;~lN^S%*Wt;Z>p7 znZelJIOXmW1Km>&5i8)!x%-9tk3s1Saj%MU&lLO9Z%qQ^CS0s&B0DW!Ol(iwd?U;K zR16+)ioSh?7N|lvfzEnP5GdZ z%ZTekNJLArzyy9K^}XH9ZTtkWo2u!5Ru-o}7duC~P1q$P(iHR@6&ShsO3|O?a|I*@ z1gNj&s||fK`bhDPo+0^_9Bq{7ReaQHKErI;Ma{raqy4O5HKOLfN-@PH{ z&}dV%SuJt5HR!RbSEV&k^kd&rEd*udxI{Ya@cKlRf{XlzQhCJ=SF{oHJ-kEZR<{om zgFJn?Hr<$|mL-evOJ=;hj)IUrNxxT*@HaCS#;;xxhzzkB)ulsZ9~L}I2(7|E40h{$ zB?n(8H>S!}P={BeUlZDL=8B#*?()K|=dA4VIu(TFYO)BV8HD9s4U~%i;k-rt767i>fO_O+1B*} zQ%j77rZwbeQ-RO^m!<-z@}^*`#MlIfz9l6@PEP7wbAEpAO6ofuNHn5trw&=KGOT79 z1j&JB2zMQyi@r;-xM6?rOKxWwcs0o9?NZT}er?EYvuW~?i+RUhJfCQ|YPT*Qn@l0S&)bk7# zu&FMBXrO4^lXucbx2{e0sGP-Of%!Pc4KBt37psAbYq#Wq zTk?pH%J7l>a!YZ$!nrHLxkG^>`@PweenPS^z9&$=Cvd(eknW$7_Pbg+;(oNiigwt@0sbJaRtHyzG z+q1?2i@@P->hPV4{O_!3-K+`z(p!0xET!jSHhH=?wp6pk_vMLtsSlk4oSk zj+ida{Az|HE4pW1oDL^^t<{hP5H!=IU$V>p4$J+2!-8i=w+hkSXwrZQGiRmdE+}pm z3@iL_z$(%7(_ZOMBgN(FyUjF<=Zuo_CuPlVG|g|M8d@QNdcmArIg{nn2XGDU*eh#( zoYf-fH|CE2V+eSb|9{Nkj)6Pul}?{t;n!M4*89Xf2SPFdVVM9(dMp1K0~B#x%x!mf zYDVl}N77596PCjDOJszi(M3>7^GgK5)0}^nQIy)?3Y>@p>!-{ZvTs=RN4$DL3_WtV zewmC=e7XoOX?~d?c)s(`GKxzZ+?f;6l7-OHu~yBTPt9C?uiRo_rW^!cCaMcB^qCXy z(lPRX4_s>IP;2J?SIgDRT^SUc`K8H0GiAal@uCzo016tQ|4(B^IuRTlvD?j9Y~@M! zigEcxWFa!PLFzb>o?-)`a5E7Yd2w}|SXz!S>}Hl{0?ccHk$=U;t;z5#nDCB?m}do< zXL$??*m{4x^!zdlh`aZX13{8yB8v0EM>e2EI-%kn)Bo2f)u6!JpujQDRpPSAQCMm? zFi{SICKFYO7rMX+>X(HOo(k2`oKCL%r3u4R?Ya7rh9@prQdIoFfo8xfISdrSn&IFZ z>fGZMa+sMuAofgc4SJ}Vkn)OnR4_VJIng17o4n}yo7w%5c}l*3TM*ns;*oM+TotPS z#~H5aW8SOtxz?Nz$v}$F<{s<5nM`=W~+<99%~~Fg~fQEof|9$|u*zHwqUg-5JY*06;18<4+VY zi@)TLqR=;T7S09v61-*h(-3XQ;B|hwID%KNpd2*!*tj`+3SDbngqQ5UV1{aON8wQ^ z9a(h$DZVoo+u)Vhj1JXh096OXa?jyqjc7usFfb%$>}lUXKCWLGN`0LT-dz_Y^o%4X z$ovrJJ94>faHgzv()hdjff$d)&CAXDe1wa9!b^lUO=!;wN*=lk-mLob%%tM5KQraHUPiC^55GSdMN_hwNoKG zV?MtACU~(Aym0f;JcdX0=+3nn5mql!#9M^ExhQIj5Y?;fGhZpff3b^gcAj+ROlRDI z;Ly5wOT0|7&%{R2EvzeT^%Hf5sDrAxw*GsrkNC?TS`)h?bP6JO+ZD2- zcZ^j@BCuG{p(QayvG|(4BXC$*9icVAXEfK5rmL-+*?SB5SduWSyea+Nx5Pnc^%lAs zn#svKQYuG9{gau%r+Tk8V1dYwOYqxFmeEL?ldwQzEHixz9F&~x?Q{*aZlr|MtSeoJH`={5R{Jr1p38HY*Lto8D+(|xD@ib2o#Wdh!6)hzVF zbnO^idY$W#7}@P-t-reh2aI$A2U}1huJ9@bI5fft-J-?MdN`K+PivrKdhfLZ&zm7v zZG+Ca0?)a|z!gi*WM^%6OV0I6&Zo7frnRRBHK&~YA*05NzyOql;kH#6Lduw^W<)~U z&%+6N&J7Ri4o&M0o+V~?`cByz!|Nr_bc6oA+GoxgaTegezOn^|CB^joO=ZvdSv>~J zYN3TLwU&kV?6Px9i*~gY#=fF7V?AGMd;k-MQSJIO7R9ky$hkKL0CUrbEjYD7Bk;UI zoGl%tiAS5I&ehzvDib!I6>Y5mWP0i-IC4ljD%-U5_ed~lTzBE{x96b9^OqYFsKX1S zU;55FNe?*k6Q;bWs!8kxvl`?QP*Wh<%=us4n65R*vS-_O^WHxo4Ka)fczC?b?Jb;zZaj+;Hwlbf_v#QS=Mzuxp=Ox5o<$y9(S=hDEv ziOoySE`h*Wx*+B>-D)==^QF@0DY^8yA=wgHxD~k-5THn79lS2jzd8zx=L05Hy3|rf zxdQ9)H~bdTk%&4a^S*W5WcUU3SwT7Q_qUF~?P6A#2L>_ZIl?Y-Nw$p5oF{@!%Q-u~ zQ`;t{>;UgQ?q_?@&7xUankyK7Ts}E{iCLkes8(ekEF}`Ke2}6SU~P}BokOKV$lwCW z)1{>HtOI$5Ihx#tsyKk?vv#mTD>__NLH&%Y;T^j6>8X4k!mB}V14CNvjmwo9oP>~gM z;jg_>$Q|+-DBS1kMYULM#HV?9h3lma;n^7PJ`Q358zxmcN=&I}eF4-{pCxXVg&5wftYw7Wh^yRqJ)W5E( zjYfh|pnMfBW@YQ5iPG))H3L(E_v($yM9KYI7Vj@KL`Gev7S;GoR%z#HdCjJ+mH1Lt zX|riNm82HfPengDDU7H?uwq&)NOm!(e(nr(IAsWB#D-!PA0wJA;{e@4IQc)f$3hf& zo+&waGr(u`^IoRAque0B8TS;v>2e>v_7dl!Vz417a*h)gdqNnXJgPe z2-CxE2hJ-4I|J-b_1ME82qq_S3rFLhgpvD%x}ap9f&sDkyHna_Ax_Nt@t`tGKpZS} z6TK`Jz1RKIPk$a)@&%q$%f9WGc5~jT=e)Ca=!agNvii8URm(o?A9wL=y8Xz;f1EW= zDk_~#R85Pw?cQ1C!b+zYEF#GsG~52+MVuX4ekJCGZj<2Cyi@*2s}o+mdukW=+>X9E z{IDJVVfy0`|Iu^EQeOF-rd)vHV=nxoH20OBM#y`=xa5_dR!HpR((9GDI~3_`v+@-I#r zZd&RfCyCuo$}}gQT|qLfg^Xt5S2)e=0J;U~pWg_ivS+c#d<9_y@ub1*aU!e*v6SM! zLeOW=PQINsZWKhVn8O0+I5G8pMdQZr2DiAFhu&EfyJ%IrSR`XNNO-nI|FKdC`lpzzGw(&5|oJ}QvUrng#9<{Z*&Qq(KxY?(~@YdAHz-)A;$%BTDewH z84DKa(cJN5(R;k*jtilDN&^6zlXyl=&1C1+)gjrkR?}$Ga`;q#0ee+ zCS6HG`HUKQ&)}Blr6k_!ZZZt9hTSR)F)T2>)eTHeVq9JkN3h62wT((WcaGs%zWt)& zU~=mY*}Disu22ZK-XE&r35hUy*Cbkv6HKb+U;{(ur#2-q!K>(vS8 zdXCS)VznlqRUOcHz5W*BNuPw|`yUhmws)d!4rc}dhhns5HTFr{NyZmr69+Sf0v+zx zyJYqODfJ_j!&Z@WNM*IN)|qwUyACd|J;Kz!vXl1k`3BBKtksi?GFq40Y|*x__N-Vu zlTTGD#p^j1<@f7*#4+x@>4Nvb9#m{5<=Q#jE!sO?^57TnH#%+0r9)S0g( zedHrbJIJ_gTKRJQrj>k75ik7P6t*w_9{LcmwlPfToQon<%x6soGEgLJoV%$y&j8s^ zKf1tUxhqB}^ST0q_bXbK;eZDx4%`<3H)@f1A`_59t<<{sEDD*qNuwcFyM53&*& z#klH4khF@$g7HKE!(!WdV3y07fc_(mfrMn-A-P$*O5}kBVqpM#D7XYTiJit^M$6)#?%gu=mQDxz~Z0D^6WrqI~1Ea3D58K(1Ihl_yLL~$Z=0jjSY-3{)nP`i2_S*K(x%>8axNV7G)sTcJn9WX4IdslO zBQV_#{-XZ_OrAAd?nX$$>B?nk(@%Jh zT4Bn^vz>EN2&z5(r@!CHE?p)?JWbR#RL+|6T~6K3Z=;w7}uE$R%vIXhIwK5Ryg zAms)=D!2i z8rW9GqSjR@%hsY?P5q2ZNbpUcF;Ec0&WN~yP6$mR~+{#wmaTl z0oCBZGO-9##ZRCtlX*+D2 zqv?tB2J8RpDw69;P_S2>G!GkH)()_23|sM|@0SK5)i#AliH-&Nj?je|sz&C|cxnue zpHuAd%m_nB0j6S=d3UQb*W-$0lf+f5X6xJ>;nxZdj1h9HCWznajyB5+aZGb z@wpL)x2QiYM7ZxKUP633>RVXCIxWZW4ETn}X5fq=nWI_pwzjJ3^i}6=QJP0H+n4J3nM_IGdb+i- zZBdl>u8P`a@lE@9{*DlVP*JwlcDKxdFFrW=dG!tR19X&qL-Lp%sL(`)U}Y9?+$+^i zv2?_L=w<8*Q{7j>ybWZOaWZo^(>60Z{CUW7NNBY*0?GhAgWA4)Xs!;S5AmVBxs%Z3 ziO=QVv+kc31Guo+v)|GfmFXf~B(H zt|7@~?gy{9*%8Kij^}NV-VFTnSa_;H^au;j_u{?Vj3h_LAB-TAR@TM6=e0y_M~MrN zw>xvp-W7k6*^P)E$jY7Va_`M6Nd5}8YsmExy?Y1kRab!@k!gmaiaeciwXXo%I1Mp54VO6${l*NF&kQ-o3?ESg zby@@4ZU-@J2bXLI{Q!ok219OcL2x~OLqPxY17i+-Vi1ach_zyXpkkQPdJy$&NRVg% zooJXQV-Qwnh+}O4ur^G_KZx|1v*k5_>ov^uDu(O9@<%b!IE@uyEZ2)RPpK@&vMgWR zGS}rKPmdtSkRV?&E!SNuPjw{+xRNi*o9oz?r|pqr=8-S|{GG~uME-lYQe^z?B5Nvr zGIouT+7PWKO1YVAMUr!k&B8F;G6JEQvh{*5@zL2z7)3~*U31f6>55sbr><$d0dkPn zFMk*}Dl8~}B=RkXR_eEl!SUisE$!j^;|jKMjhc`X`=~zm;@Aa=r-uF2f84SciAMEO z4?w5oYv62@q zMOI&Y${o^C!9GlZnj%vEJD7dZ1HoPY#+CDLtpQ4-_%_BRbMEdRZ^!ZZ=&5yWM6seL zP127=ehox-`MrXlpgm%E9a32v_;C%9$U4mdwnasTYLENVX6Uq-o%Eiwk4*kj? z2M5Xe}X1pxT zI<`1eLh0BuoWEGS#mTQeaXP0_y7CT~s<#Q{kGphD9CLBZud#mYRow|Z*GO!Xo&l~}yOy1v$8)7kpoK)1}y>+7BqQSrqX z54rzCvP$~ON_1^~p$97&(Pp*9x~&*19ygW$EzQHsX*P+;VOVZC_77rxIR_Teupi*e z$k3+lqa!*E>H3&9H8qrW&%c#=bRQ(WM}e~Ui_s2?ZbW8*QF>s{GAv^hc0r*gI9DON zKRvqPW;LSWm6V~pare5&QL@TqBu*wX)hb>GFu28fBNxoiyhzbXV23PGYUTjTcMuZ2 zO}!Ay`(iCM5VSl`@P)G`m;yQYnMnJ`%Vtcsx1k#Ro2=;n>!sOdr-^)`YGGt%Eosj( zDq|G;Od)KK5$7O_Tpe0%+Vmt0brPwgFJ0g20Pv(4H}-OQ6sitxXLE$8qqoQd^H7x+ zud~g~H32I>{RGqhe1#3bDyMI?z#|(iFYiKl_%kh=?SXf*o~hcd9xiW&x^~@-RHc(3 z=00JbSEi5M2EKPySjWWid)#6wkFCA$151RAD+u}AZb&{OZwXs5>%4CDuG3NSHkFu% z#X-w9G2fLhwnD-J5+k7l(wf$t3C}6 zyRpyt&6Mvx<(HL+=yvqKBWLj$O~j9(lAk4xjc-@X!Mb8JWGg{Fzl_7i4g4JqI@C4~ zH`fn+b+VmYIxG!l7X{TJa^%Ivi|wqk#UwxaAkM3yopMlTdwG9`o-hNd$k;W8PksRk z^PM9-QS7VF8v|Yb$*pL%o2#D}tv80=&-;85DOuQ_LsNDJSQ*&g@!$H0i#2rY-Q<6U zAVo{sww?zIrpN1v*2+zX@k&yCeo19>PHmv+R9cSD>EO0sxThGpW#dk* zRntjrQtGG3F--js93_gfmTD1N^F=PsCCXNo49=z60$Tl@s1nmFS`w$00@PPR#PwaA z(;+Lr2(2)IWs?o9P18*)a@v-3p9_%R)Emnl_0WO%&=C^X0Ug&7G5NatRi#u)xsCOo zJ~X>RDnS9g37tgim~v+3<&5sg&bU`_^)*Kqi0hGZb7$2nl#Dw*pF7Q%`|mDy7AE&h zr{mfuF_IkymE)IU2ZCZpI5P(vGtsckwg*qIY!a}j&p-@MkSI@Nzi+?if-V1O^%|s% z7x2#VkdT)|?yDr8-xv0r{!`E0$1KN7HzmNKs?XoWYm=4``96hcBSGv%2SLE1lpy9J ztsvo|r6BGifgs7ER@c`>H9-XTTTzgMAhP=&S?sXD7x#b0vBUfq75kVVHR{?gr>`BB z@79w+oRx10M5gzq=ke1vhaX4u^!IZ$1()o%bF5i^WGaNI;C9J%0<^&hdc9v|dNI64 zd+2d$1Dvf5aTgCl)-qNd%q~XX+^J&@5c#7H!K8YJJ4Q{Q(%gz5l^C>)a;$4 zrl60VVx3&_>SESED0;h+E1T^#KTg{>5voU$V@ser=m;DA&Fshz+kA2!%o8|oy`p#c z7tyYxfeYeU>oXab&%G;}3@b~H0wG8`LIdrss_AYA!w$Kpp&qu)7RsnsW7>Pqh8xG{ zD--2L{J8BtEiUSzoDT%4Jrq?WxdQ)689ELq9cUsGI{G$(JKpu|<+jT~rCyUfQPq6K zHz&#M=T+`=z~xY%j*cwUlP7y`#+BSp}bUf zDUNxI9@7TrK#o~X|YZGeUJ$uSEX zCo>CUE>C#p`5X;V4mk=0CpkfISaoVb=7nm6lk~k949iLk>(AO**qUKUn!&1?QS+LC z9GVf0niAAs0L0p%{vNOD@*5k<>ON3`UzHTk&wipcLDm3V#8F)aYpMILxHl_tpO>I; zca^Ne#;^Q51%ig{@UjNVxe2Ow$ugq9xFJuf`aLL z-Tv0XC1?(NOc;@AGl!m^^+37QB1J6q6Vo50=@3e{Fmm-e*bJ>-g)M$`k)v&~oDJ`~ zP#r?J1{BfddFrsU8C~vSVZ}hNgFtuuQX~%+DpDV?-)3T#nB2PC` z2KqBZ&n!Nn+BCGEnWUdB9CP-Yt`ccmX8V1$I$Ld72qFDiq>4k2__MWZ@ynutgS3!z z9hP)GGNA!9!yKIE->1!|zgDo_cTTy0pYOJ76c4U>K{DCF5aHffIsYWSk9lL|&PuRY zDnwx1x@9K1XVUjWvlCF(_`#-(*ti&D#O&JZp*?_!WoqSCVU^EW)BUR7CMpiaeJnX0 zcBe74I&ff~svICTr6DnPl|SY;jv(R)HaiN*;0vimVapUE)EfK+<>2x|6Ik?Xxgwcv z0Dj{wL^M(g7_-6(PqB`^07yT3gzKzTv}rOAENG8v5+vaq{blGGAl+ZD*W8-7NRi{#Z!L-D&B^ZYh~yZy6u%2^@EC~?5Hj0ihx{v>6d_g_9_l(`6- z)=u+cG^$e`()#UNjX%?~;CsLPBcS^bP3JqUCQaG=7bKUB7)$SX^_Rph%Llzb*i7Vk zWAHn3@t5|TO1lsGQ%O2eLn*;HmkFgu5Q-yd-CDi(zzRcu!LRiLAJAzrzh?gzlk`*n Ef5?p+(f|Me literal 0 HcmV?d00001 diff --git a/SourceSerifPro-LICENSE.md b/SourceSerif4-LICENSE.md similarity index 98% rename from SourceSerifPro-LICENSE.md rename to SourceSerif4-LICENSE.md index 22cb755f..68ea1892 100644 --- a/SourceSerifPro-LICENSE.md +++ b/SourceSerif4-LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2014-2018 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. This Font Software is licensed under the SIL Open Font License, Version 1.1. diff --git a/SourceSerif4-Regular.ttf.woff b/SourceSerif4-Regular.ttf.woff new file mode 100644 index 0000000000000000000000000000000000000000..45a5521ab0c77a02ebf55a3f7305faccc02e2894 GIT binary patch literal 103604 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 literal 0 HcmV?d00001 diff --git a/SourceSerifPro-Bold.ttf.woff b/SourceSerifPro-Bold.ttf.woff deleted file mode 100644 index ca254318fe9ea9fc0f3313bc5df7ea5109f16921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93248 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 z 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 f7WG97r8^C<#}#z-`S23!^JU{=fAN_v-4v@4O diff --git a/SourceSerifPro-It.ttf.woff b/SourceSerifPro-It.ttf.woff deleted file mode 100644 index a287bbe6ed3f871376686682bb455d71a13882b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36200 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 z 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

=K7)cy&MM-4KyhJcQOumB9&yWI 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

9MHs_oj@6Qz@1rU$v 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,h4>code,h5>code{color:#e6e1cf;}pre>code{color:#e6e1cf;}span code{color:#e6e1cf;}.docblock a>code{color:#39AFD7 !important;}.docblock code,.docblock-short code{background-color:#191f26;}pre{color:#e6e1cf;background-color:#191f26;}.sidebar{background-color:#14191f;}.logo-container.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);}*{scrollbar-color:#5c6773 transparent;}.sidebar{scrollbar-color:#5c6773 transparent;}::-webkit-scrollbar-track{background-color:transparent;}::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar::-webkit-scrollbar-track{background-color:transparent;}.sidebar::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar .current{background-color:transparent;color:#ffb44c;}.source .sidebar{background-color:#0f1419;}.sidebar .location{border-color:#000;background-color:#0f1419;color:#fff;}.sidebar-elems .location{color:#ff7733;}.sidebar-elems .location a{color:#fff;}.sidebar .version{border-bottom-color:#424c57;}.sidebar-title{border-top-color:#5c6773;border-bottom-color:#5c6773;}.block a:hover{background:transparent;color:#ffb44c;}.line-numbers span{color:#5c6773;}.line-numbers .line-highlighted{color:#708090;background-color:rgba(255,236,164,0.06);padding-right:4px;border-right:1px solid #ffb44c;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#5c6773;}.docblock table,.docblock table td,.docblock table th{border-color:#5c6773;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#c5c5c5;}.content .highlighted{color:#000 !important;background-color:#c6afb3;}.content .highlighted a,.content .highlighted span{color:#000 !important;}.content .highlighted{background-color:#c6afb3;}.search-results a{color:#0096cf;}.search-results a span.desc{color:#c5c5c5;}.content .item-info::before{color:#ccc;}.content span.foreigntype,.content a.foreigntype{color:#ef57ff;}.content span.union,.content a.union{color:#98a01c;}.content span.constant,.content a.constant,.content span.static,.content a.static{color:#6380a0;}.content span.primitive,.content a.primitive{color:#32889b;}.content span.traitalias,.content a.traitalias{color:#57d399;}.content span.keyword,.content a.keyword{color:#de5249;}.content span.externcrate,.content span.mod,.content a.mod{color:#acccf9;}.content span.struct,.content a.struct{color:#ffa0a5;}.content span.enum,.content a.enum{color:#99e0c9;}.content span.trait,.content a.trait{color:#39AFD7;}.content span.type,.content a.type{color:#cfbcf5;}.content span.fn,.content a.fn,.content span.method,.content a.method,.content span.tymethod,.content a.tymethod,.content .fnname{color:#fdd687;}.content span.attr,.content a.attr,.content span.derive,.content a.derive,.content span.macro,.content a.macro{color:#a37acc;}pre.rust .comment{color:#788797;}pre.rust .doccomment{color:#a1ac88;}nav:not(.sidebar){border-bottom-color:#424c57;}nav.main .current{border-top-color:#5c6773;border-bottom-color:#5c6773;}nav.main .separator{border:1px solid #5c6773;}a{color:#c5c5c5;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#39AFD7;}.collapse-toggle{color:#999;}#crate-search{color:#c5c5c5;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;border-color:#424c57;}.search-input{color:#ffffff;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;transition:box-shadow 150ms ease-in-out;}#crate-search+.search-input:focus{box-shadow:0 0 0 1px #148099,0 0 0 2px transparent;}.search-focus:disabled{color:#929292;}.module-item .stab{color:#000;}.stab.unstable,.stab.deprecated,.stab.portability{color:#c5c5c5;background:#314559 !important;border-style:none !important;border-radius:4px;padding:3px 6px 3px 6px;}.stab.portability>code{color:#e6e1cf;background-color:transparent;}#help>div{background:#14191f;box-shadow:0px 6px 20px 0px black;border:none;border-radius:4px;}#help>div>span{border-bottom-color:#5c6773;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:#788797;}.line-numbers :target{background-color:transparent;}pre.rust .number,pre.rust .string{color:#b8cc52;}pre.rust .kw,pre.rust .kw-2,pre.rust .prelude-ty,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .op,pre.rust .lifetime{color:#ff7733;}pre.rust .macro,pre.rust .macro-nonterminal{color:#a37acc;}pre.rust .question-mark{color:#ff9011;}pre.rust .self{color:#36a3d9;font-style:italic;}pre.rust .attribute{color:#e6e1cf;}pre.rust .attribute .ident,pre.rust .attribute .op{color:#e6e1cf;}.example-wrap>pre.line-number{color:#5c67736e;border:none;}a.test-arrow{font-size:100%;color:#788797;border-radius:4px;background-color:rgba(57,175,215,0.09);}a.test-arrow:hover{background-color:rgba(57,175,215,0.368);color:#c5c5c5;}.toggle-label{color:#999;}:target>code,:target>.in-band{background:rgba(255,236,164,0.06);border-right:3px solid rgba(255,180,76,0.85);}pre.compile_fail{border-left:2px solid rgba(255,0,0,.4);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.4);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#39AFD7;}.tooltip::after{background-color:#314559;color:#c5c5c5;border:1px solid #5c6773;}.tooltip::before{border-color:transparent #314559 transparent transparent;}.notable-traits-tooltiptext{background-color:#314559;border-color:#5c6773;}#titles>button.selected{background-color:#141920 !important;border-bottom:1px solid #ffb44c !important;border-top:none;}#titles>button:not(.selected){background-color:transparent !important;border:none;}#titles>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}#titles>button>div.count{color:#888;}.content .highlighted.mod,.content .highlighted.externcrate{}.search-input:focus{}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{}.content .highlighted.trait{}.content span.struct,.content a.struct,.block a.current.struct{}#titles>button:hover,#titles>button.selected{}.content .highlighted.traitalias{}.content span.type,.content a.type,.block a.current.type{}.content span.union,.content a.union,.block a.current.union{}.content .highlighted.foreigntype{}pre.rust .lifetime{}.content .highlighted.primitive{}.content .highlighted.constant,.content .highlighted.static{}.stab.unstable{}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){}.content span.enum,.content a.enum,.block a.current.enum{}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{}.content span.keyword,.content a.keyword,.block a.current.keyword{}pre.rust .comment{}.content .highlighted.enum{}.content .highlighted.struct{}.content .highlighted.keyword{}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{}pre.rust .kw{}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{}pre.rust .doccomment{}.stab.deprecated{}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{}.stab.portability{}.content .highlighted.union{}.content span.primitive,.content a.primitive,.block a.current.primitive{}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{}.content .highlighted.type{}pre.rust .kw-2,pre.rust .prelude-ty{}.content span.trait,.content a.trait,.block a.current.trait{}@media (max-width:700px){.sidebar-menu{background-color:#14191f;border-bottom-color:#5c6773;border-right-color:#5c6773;}.sidebar-elems{background-color:#14191f;border-right-color:#5c6773;}#sidebar-filler{background-color:#14191f;border-bottom-color:#5c6773;}}kbd{color:#c5c5c5;background-color:#314559;border-color:#5c6773;border-bottom-color:#5c6773;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,.help-button{border-color:#5c6773;background-color:#0f1419;color:#fff;}#theme-picker>img,#settings-menu>img{filter:invert(100);}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,.help-button:hover,.help-button:focus{border-color:#e0e0e0;}#theme-choices{border-color:#5c6773;background-color:#0f1419;}#theme-choices>button:not(:first-child){border-top-color:#5c6773;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:rgba(110,110,110,0.33);}@media (max-width:700px){#theme-picker{background:#0f1419;}}#all-types{background-color:#14191f;}#all-types:hover{background-color:rgba(70,70,70,0.33);}.search-results td span.alias{color:#c5c5c5;}.search-results td span.grey{color:#999;}#sidebar-toggle{background-color:#14191f;}#sidebar-toggle:hover{background-color:rgba(70,70,70,0.33);}#source-sidebar{background-color:#14191f;}#source-sidebar>.title{color:#fff;border-bottom-color:#5c6773;}div.files>a:hover,div.name:hover{background-color:#14191f;color:#ffb44c;}div.files>.selected{background-color:#14191f;color:#ffb44c;}.setting-line>.title{border-bottom-color:#5c6773;}input:checked+.slider{background-color:#ffb454 !important;} \ No newline at end of file + body{background-color:#0f1419;color:#c5c5c5;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:white;}h1.fqn{border-bottom-color:#5c6773;}h1.fqn a{color:#fff;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod){border-bottom-color:#5c6773;}h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){border:none;}.in-band{background-color:#0f1419;}.invisible{background:rgba(0,0,0,0);}code{color:#ffb454;}h3>code,h4>code,h5>code{color:#e6e1cf;}pre>code{color:#e6e1cf;}span code{color:#e6e1cf;}.docblock a>code{color:#39AFD7 !important;}.docblock code,.docblock-short code{background-color:#191f26;}pre{color:#e6e1cf;background-color:#191f26;}.sidebar{background-color:#14191f;}.logo-container.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);}*{scrollbar-color:#5c6773 transparent;}.sidebar{scrollbar-color:#5c6773 transparent;}::-webkit-scrollbar-track{background-color:transparent;}::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar::-webkit-scrollbar-track{background-color:transparent;}.sidebar::-webkit-scrollbar-thumb{background-color:#5c6773;}.sidebar .current{background-color:transparent;color:#ffb44c;}.source .sidebar{background-color:#0f1419;}.sidebar .location{border-color:#000;background-color:#0f1419;color:#fff;}.sidebar-elems .location{color:#ff7733;}.sidebar-elems .location a{color:#fff;}.sidebar .version{border-bottom-color:#424c57;}.sidebar-title{border-top-color:#5c6773;border-bottom-color:#5c6773;}.block a:hover{background:transparent;color:#ffb44c;}.line-numbers span{color:#5c6773;}.line-numbers .line-highlighted{color:#708090;background-color:rgba(255,236,164,0.06);padding-right:4px;border-right:1px solid #ffb44c;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#5c6773;}.docblock table,.docblock table td,.docblock table th{border-color:#5c6773;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#c5c5c5;}.content .highlighted{color:#000 !important;background-color:#c6afb3;}.content .highlighted a,.content .highlighted span{color:#000 !important;}.content .highlighted{background-color:#c6afb3;}.search-results a{color:#0096cf;}.search-results a span.desc{color:#c5c5c5;}.content .item-info::before{color:#ccc;}.content span.foreigntype,.content a.foreigntype{color:#ef57ff;}.content span.union,.content a.union{color:#98a01c;}.content span.constant,.content a.constant,.content span.static,.content a.static{color:#6380a0;}.content span.primitive,.content a.primitive{color:#32889b;}.content span.traitalias,.content a.traitalias{color:#57d399;}.content span.keyword,.content a.keyword{color:#de5249;}.content span.externcrate,.content span.mod,.content a.mod{color:#acccf9;}.content span.struct,.content a.struct{color:#ffa0a5;}.content span.enum,.content a.enum{color:#99e0c9;}.content span.trait,.content a.trait{color:#39AFD7;}.content span.type,.content a.type{color:#cfbcf5;}.content span.fn,.content a.fn,.content span.method,.content a.method,.content span.tymethod,.content a.tymethod,.content .fnname{color:#fdd687;}.content span.attr,.content a.attr,.content span.derive,.content a.derive,.content span.macro,.content a.macro{color:#a37acc;}pre.rust .comment{color:#788797;}pre.rust .doccomment{color:#a1ac88;}nav:not(.sidebar){border-bottom-color:#424c57;}nav.main .current{border-top-color:#5c6773;border-bottom-color:#5c6773;}nav.main .separator{border:1px solid #5c6773;}a{color:#c5c5c5;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#39AFD7;}.collapse-toggle,details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before{color:#999;}#crate-search{color:#c5c5c5;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;border-color:#424c57;}.search-input{color:#ffffff;background-color:#141920;box-shadow:0 0 0 1px #424c57,0 0 0 2px transparent;transition:box-shadow 150ms ease-in-out;}#crate-search+.search-input:focus{box-shadow:0 0 0 1px #148099,0 0 0 2px transparent;}.search-focus:disabled{color:#929292;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable,.stab.deprecated,.stab.portability{color:#c5c5c5;background:#314559 !important;border-style:none !important;border-radius:4px;padding:3px 6px 3px 6px;}.stab.portability>code{color:#e6e1cf;background:none;}#help>div{background:#14191f;box-shadow:0px 6px 20px 0px black;border:none;border-radius:4px;}#help>div>span{border-bottom-color:#5c6773;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:#788797;}.line-numbers :target{background-color:transparent;}pre.rust .number,pre.rust .string{color:#b8cc52;}pre.rust .kw,pre.rust .kw-2,pre.rust .prelude-ty,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .op,pre.rust .lifetime{color:#ff7733;}pre.rust .macro,pre.rust .macro-nonterminal{color:#a37acc;}pre.rust .question-mark{color:#ff9011;}pre.rust .self{color:#36a3d9;font-style:italic;}pre.rust .attribute{color:#e6e1cf;}pre.rust .attribute .ident,pre.rust .attribute .op{color:#e6e1cf;}.example-wrap>pre.line-number{color:#5c67736e;border:none;}a.test-arrow{font-size:100%;color:#788797;border-radius:4px;background-color:rgba(57,175,215,0.09);}a.test-arrow:hover{background-color:rgba(57,175,215,0.368);color:#c5c5c5;}.toggle-label,.code-attribute{color:#999;}:target>code,:target>.in-band{background:rgba(255,236,164,0.06);border-right:3px solid rgba(255,180,76,0.85);}pre.compile_fail{border-left:2px solid rgba(255,0,0,.4);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.4);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#39AFD7;}.tooltip::after{background-color:#314559;color:#c5c5c5;border:1px solid #5c6773;}.tooltip::before{border-color:transparent #314559 transparent transparent;}.notable-traits-tooltiptext{background-color:#314559;border-color:#5c6773;}#titles>button.selected{background-color:#141920 !important;border-bottom:1px solid #ffb44c !important;border-top:none;}#titles>button:not(.selected){background-color:transparent !important;border:none;}#titles>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}#titles>button>div.count{color:#888;}.content .highlighted.mod,.content .highlighted.externcrate{}.search-input:focus{}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{}.content .highlighted.trait{}.content span.struct,.content a.struct,.block a.current.struct{}#titles>button:hover,#titles>button.selected{}.content .highlighted.traitalias{}.content span.type,.content a.type,.block a.current.type{}.content span.union,.content a.union,.block a.current.union{}.content .highlighted.foreigntype{}pre.rust .lifetime{}.content .highlighted.primitive{}.content .highlighted.constant,.content .highlighted.static{}.stab.unstable{}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){}.content span.enum,.content a.enum,.block a.current.enum{}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{}.content span.keyword,.content a.keyword,.block a.current.keyword{}pre.rust .comment{}.content .highlighted.enum{}.content .highlighted.struct{}.content .highlighted.keyword{}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{}pre.rust .kw{}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{}pre.rust .doccomment{}.stab.deprecated{}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{}.stab.portability{}.content .highlighted.union{}.content span.primitive,.content a.primitive,.block a.current.primitive{}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{}.content .highlighted.type{}pre.rust .kw-2,pre.rust .prelude-ty{}.content span.trait,.content a.trait,.block a.current.trait{}@media (max-width:700px){.sidebar-menu{background-color:#14191f;border-bottom-color:#5c6773;border-right-color:#5c6773;}.sidebar-elems{background-color:#14191f;border-right-color:#5c6773;}#sidebar-filler{background-color:#14191f;border-bottom-color:#5c6773;}}kbd{color:#c5c5c5;background-color:#314559;border-color:#5c6773;border-bottom-color:#5c6773;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,.help-button,#copy-path{border-color:#5c6773;background-color:#0f1419;color:#fff;}#theme-picker>img,#settings-menu>img{filter:invert(100);}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,.help-button:hover,.help-button:focus,#copy-path:hover,#copy-path:focus{border-color:#e0e0e0;}#theme-choices{border-color:#5c6773;background-color:#0f1419;}#theme-choices>button:not(:first-child){border-top-color:#5c6773;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:rgba(110,110,110,0.33);}@media (max-width:700px){#theme-picker{background:#0f1419;}}#all-types{background-color:#14191f;}#all-types:hover{background-color:rgba(70,70,70,0.33);}.search-results td span.alias{color:#c5c5c5;}.search-results td span.grey{color:#999;}#sidebar-toggle{background-color:#14191f;}#sidebar-toggle:hover{background-color:rgba(70,70,70,0.33);}#source-sidebar{background-color:#14191f;}#source-sidebar>.title{color:#fff;border-bottom-color:#5c6773;}div.files>a:hover,div.name:hover{background-color:#14191f;color:#ffb44c;}div.files>.selected{background-color:#14191f;color:#ffb44c;}.setting-line>.title{border-bottom-color:#5c6773;}input:checked+.slider{background-color:#ffb454 !important;} \ No newline at end of file diff --git a/crates.js b/crates.js new file mode 100644 index 00000000..e343d53a --- /dev/null +++ b/crates.js @@ -0,0 +1 @@ +window.ALL_CRATES = ["mcaptcha","tests_migrate"]; \ No newline at end of file diff --git a/dark.css b/dark.css index 57e76d07..d606c8e2 100644 --- a/dark.css +++ b/dark.css @@ -1 +1 @@ -body{background-color:#353535;color:#ddd;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:#ddd;}h1.fqn{border-bottom-color:#d2d2d2;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#d2d2d2;}.in-band{background-color:#353535;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#2A2A2A;}pre{background-color:#2A2A2A;}.sidebar{background-color:#505050;}.logo-container.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff)}*{scrollbar-color:rgb(64,65,67) #717171;}.sidebar{scrollbar-color:rgba(32,34,37,.6) transparent;}::-webkit-scrollbar-track{background-color:#717171;}::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar::-webkit-scrollbar-track{background-color:#717171;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar .current{background-color:#333;}.source .sidebar{background-color:#353535;}.sidebar .location{border-color:#fff;background:#575757;color:#DDD;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#444;}.line-numbers span{color:#3B91E2;}.line-numbers .line-highlighted{background-color:#0a042f !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#DDD;}.docblock table,.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#ddd;}.content .highlighted{color:#eee !important;background-color:#616161;}.content .highlighted a,.content .highlighted span{color:#eee !important;}.content .highlighted.trait{background-color:#013191;}.content .highlighted.traitalias{background-color:#013191;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.mod{background-color:#803a1b;}.content .highlighted.externcrate{background-color:#396bac;}.content .highlighted.enum{background-color:#5b4e68;}.content .highlighted.struct{background-color:#194e9f;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#4950ed;}.content .highlighted.type{background-color:#38902c;}.content .highlighted.foreigntype{background-color:#b200d6;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#217d1c;}.content .highlighted.constant,.content .highlighted.static{background-color:#0063cc;}.content .highlighted.primitive{background-color:#00708a;}.content .highlighted.keyword{background-color:#884719;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#82b089;}.content span.struct,.content a.struct,.block a.current.struct{color:#2dbfb8;}.content span.type,.content a.type,.block a.current.type{color:#ff7f00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#dd7de8;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#09bd00;}.content span.union,.content a.union,.block a.current.union{color:#a6ae37;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#82a5c9;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#43aec7;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#bda000;}.content span.trait,.content a.trait,.block a.current.trait{color:#b78cf2;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#b397da;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#2BAB63;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8d8d8b;}pre.rust .doccomment{color:#8ca375;}nav:not(.sidebar){border-bottom-color:#4e4e4e;}nav.main .current{border-top-color:#eee;border-bottom-color:#eee;}nav.main .separator{border-color:#eee;}a{color:#ddd;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#D2991D;}a.test-arrow{color:#dedede;}.collapse-toggle{color:#999;}#crate-search{color:#111;background-color:#f0f0f0;border-color:#000;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input{color:#111;background-color:#f0f0f0;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input:focus{border-color:#008dfd;}.search-focus:disabled{background-color:#c5c4c4;}#crate-search+.search-input:focus{box-shadow:0 0 8px 4px #078dd8;}.module-item .stab{color:#ddd;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;color:#2f2f2f;}.stab.deprecated{background:#F3DFFF;border-color:#7F0087;color:#2f2f2f;}.stab.portability{background:#C4ECFF;border-color:#7BA5DB;color:#2f2f2f;}.stab.portability>code{color:#ddd;}#help>div{background:#4d4d4d;border-color:#bfbfbf;}#help>div>span{border-bottom-color:#bfbfbf;}#help dt{border-color:#bfbfbf;background:rgba(0,0,0,0);}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:#ddd;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#ab8ac1;}pre.rust .kw-2,pre.rust .prelude-ty{color:#769acb;}pre.rust .number,pre.rust .string{color:#83a300;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#ee6868;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#d97f26;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#4a4949;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label{color:#999;}:target>code,:target>.in-band{background-color:#494a3d;border-right:3px solid #bb7410;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.8);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.8);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.8);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.8);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;border-color:#000;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#111;border-color:#777;}#titles>button:not(.selected){background-color:#252525;border-top-color:#252525;}#titles>button:hover,#titles>button.selected{border-top-color:#0089ff;background-color:#353535;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#505050;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#505050;border-right-color:#000;}#sidebar-filler{background-color:#505050;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,.help-button{border-color:#e0e0e0;background:#f0f0f0;color:#000;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,.help-button:hover,.help-button:focus{border-color:#ffb900;}#theme-choices{border-color:#e0e0e0;background-color:#353535;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#4e4e4e;}@media (max-width:700px){#theme-picker{background:#f0f0f0;}}#all-types{background-color:#505050;}#all-types:hover{background-color:#606060;}.search-results td span.alias{color:#fff;}.search-results td span.grey{color:#ccc;}#sidebar-toggle{background-color:#565656;}#sidebar-toggle:hover{background-color:#676767;}#source-sidebar{background-color:#565656;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#444;}div.files>.selected{background-color:#333;}.setting-line>.title{border-bottom-color:#ddd;} \ No newline at end of file +body{background-color:#353535;color:#ddd;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:#ddd;}h1.fqn{border-bottom-color:#d2d2d2;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#d2d2d2;}.in-band{background-color:#353535;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#2A2A2A;}pre{background-color:#2A2A2A;}.sidebar{background-color:#505050;}.logo-container.rust-logo>img{filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff)}*{scrollbar-color:rgb(64,65,67) #717171;}.sidebar{scrollbar-color:rgba(32,34,37,.6) transparent;}::-webkit-scrollbar-track{background-color:#717171;}::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar::-webkit-scrollbar-track{background-color:#717171;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(32,34,37,.6);}.sidebar .current{background-color:#333;}.source .sidebar{background-color:#353535;}.sidebar .location{border-color:#fff;background:#575757;color:#DDD;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#444;}.line-numbers span{color:#3B91E2;}.line-numbers .line-highlighted{background-color:#0a042f !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#DDD;}.docblock table,.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#ddd;}.content .highlighted{color:#eee !important;background-color:#616161;}.content .highlighted a,.content .highlighted span{color:#eee !important;}.content .highlighted.trait{background-color:#013191;}.content .highlighted.traitalias{background-color:#013191;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.mod{background-color:#803a1b;}.content .highlighted.externcrate{background-color:#396bac;}.content .highlighted.enum{background-color:#5b4e68;}.content .highlighted.struct{background-color:#194e9f;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#4950ed;}.content .highlighted.type{background-color:#38902c;}.content .highlighted.foreigntype{background-color:#b200d6;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#217d1c;}.content .highlighted.constant,.content .highlighted.static{background-color:#0063cc;}.content .highlighted.primitive{background-color:#00708a;}.content .highlighted.keyword{background-color:#884719;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#82b089;}.content span.struct,.content a.struct,.block a.current.struct{color:#2dbfb8;}.content span.type,.content a.type,.block a.current.type{color:#ff7f00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#dd7de8;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#09bd00;}.content span.union,.content a.union,.block a.current.union{color:#a6ae37;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#82a5c9;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#43aec7;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#bda000;}.content span.trait,.content a.trait,.block a.current.trait{color:#b78cf2;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#b397da;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#2BAB63;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8d8d8b;}pre.rust .doccomment{color:#8ca375;}nav:not(.sidebar){border-bottom-color:#4e4e4e;}nav.main .current{border-top-color:#eee;border-bottom-color:#eee;}nav.main .separator{border-color:#eee;}a{color:#ddd;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#D2991D;}a.test-arrow{color:#dedede;}.collapse-toggle,details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before{color:#999;}#crate-search{color:#111;background-color:#f0f0f0;border-color:#000;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input{color:#111;background-color:#f0f0f0;box-shadow:0 0 0 1px #000,0 0 0 2px transparent;}.search-input:focus{border-color:#008dfd;}.search-focus:disabled{background-color:#c5c4c4;}#crate-search+.search-input:focus{box-shadow:0 0 8px 4px #078dd8;}.module-item .stab,.import-item .stab{color:#ddd;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;color:#2f2f2f;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;color:#2f2f2f;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;color:#2f2f2f;}.stab.portability>code{background:none;}#help>div{background:#4d4d4d;border-color:#bfbfbf;}#help>div>span{border-bottom-color:#bfbfbf;}#help dt{border-color:#bfbfbf;background:rgba(0,0,0,0);}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:#ddd;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#ab8ac1;}pre.rust .kw-2,pre.rust .prelude-ty{color:#769acb;}pre.rust .number,pre.rust .string{color:#83a300;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#ee6868;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#d97f26;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#4a4949;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target>code,:target>.in-band{background-color:#494a3d;border-right:3px solid #bb7410;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.8);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.8);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.8);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.8);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;border-color:#000;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#111;border-color:#777;}#titles>button:not(.selected){background-color:#252525;border-top-color:#252525;}#titles>button:hover,#titles>button.selected{border-top-color:#0089ff;background-color:#353535;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#505050;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#505050;border-right-color:#000;}#sidebar-filler{background-color:#505050;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,.help-button,#copy-path{border-color:#e0e0e0;background:#f0f0f0;color:#000;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,.help-button:hover,.help-button:focus,#copy-path:hover,#copy-path:focus{border-color:#ffb900;}#theme-choices{border-color:#e0e0e0;background-color:#353535;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#4e4e4e;}@media (max-width:700px){#theme-picker{background:#f0f0f0;}}#all-types{background-color:#505050;}#all-types:hover{background-color:#606060;}.search-results td span.alias{color:#fff;}.search-results td span.grey{color:#ccc;}#sidebar-toggle{background-color:#565656;}#sidebar-toggle:hover{background-color:#676767;}#source-sidebar{background-color:#565656;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#444;}div.files>.selected{background-color:#333;}.setting-line>.title{border-bottom-color:#ddd;} \ No newline at end of file diff --git a/implementors/actix_service/trait.Service.js b/implementors/actix_service/trait.Service.js index d8812291..ef2b327b 100644 --- a/implementors/actix_service/trait.Service.js +++ b/implementors/actix_service/trait.Service.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl<S, B> Service for CheckLoginMiddleware<S> where
    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
    S::Future: 'static, 
","synthetic":false,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]}]; +implementors["mcaptcha"] = [{"text":"impl<S> Service<ServiceRequest> for CheckLoginMiddleware<S> where
    S: Service<ServiceRequest, Response = ServiceResponse<AnyBody>, Error = Error>,
    S::Future: 'static, 
","synthetic":false,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/actix_service/transform/trait.Transform.js b/implementors/actix_service/transform/trait.Transform.js index 787bce57..d7da98c9 100644 --- a/implementors/actix_service/transform/trait.Transform.js +++ b/implementors/actix_service/transform/trait.Transform.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl<S, B> Transform<S> for CheckLogin where
    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
    S::Future: 'static, 
","synthetic":false,"types":["mcaptcha::middleware::auth::CheckLogin"]}]; +implementors["mcaptcha"] = [{"text":"impl<S> Transform<S, ServiceRequest> for CheckLogin where
    S: Service<ServiceRequest, Response = ServiceResponse<AnyBody>, Error = Error>,
    S::Future: 'static, 
","synthetic":false,"types":["mcaptcha::middleware::auth::CheckLogin"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/actix_http/error/trait.ResponseError.js b/implementors/actix_web/error/response_error/trait.ResponseError.js similarity index 100% rename from implementors/actix_http/error/trait.ResponseError.js rename to implementors/actix_web/error/response_error/trait.ResponseError.js diff --git a/implementors/core/clone/trait.Clone.js b/implementors/core/clone/trait.Clone.js index f93da7b5..8813211e 100644 --- a/implementors/core/clone/trait.Clone.js +++ b/implementors/core/clone/trait.Clone.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Clone for Email","synthetic":false,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Clone for Secret","synthetic":false,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Clone for AccountCheckPayload","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Clone for AccountCheckResp","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Clone for Register","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Clone for Login","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Clone for Password","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Clone for MCaptchaID","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Clone for MCaptchaDetails","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Clone for Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Clone for I32Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Clone for BuildDetails","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Clone for BuildDetailsBuilder","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Clone for Health","synthetic":false,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Clone for HealthBuilder","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Clone for GetConfigPayload","synthetic":false,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Clone for ValidationToken","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Clone for CaptchaValidateResp","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl<'a> Clone for ErrorPage<'a>","synthetic":false,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl<'a> Clone for IndexPage<'a>","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Clone for McaptchaConfig","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Clone for Level","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Clone for Server","synthetic":false,"types":["mcaptcha::settings::Server"]},{"text":"impl Clone for Captcha","synthetic":false,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Clone for Smtp","synthetic":false,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Clone for DatabaseBuilder","synthetic":false,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Clone for Database","synthetic":false,"types":["mcaptcha::settings::Database"]},{"text":"impl Clone for Redis","synthetic":false,"types":["mcaptcha::settings::Redis"]},{"text":"impl Clone for Settings","synthetic":false,"types":["mcaptcha::settings::Settings"]},{"text":"impl Clone for Stats","synthetic":false,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::widget::IndexPage"]}]; +implementors["mcaptcha"] = [{"text":"impl Clone for Email","synthetic":false,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Clone for Secret","synthetic":false,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Clone for AccountCheckPayload","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Clone for AccountCheckResp","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Clone for Register","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Clone for Login","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Clone for Password","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Clone for MCaptchaID","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Clone for MCaptchaDetails","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Clone for Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Clone for I32Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Clone for BuildDetails","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Clone for BuildDetailsBuilder","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Clone for Health","synthetic":false,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Clone for HealthBuilder","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Clone for GetConfigPayload","synthetic":false,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Clone for ValidationToken","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Clone for CaptchaValidateResp","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl<'a> Clone for IndexPage<'a>","synthetic":false,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl<'a> Clone for ErrorPage<'a>","synthetic":false,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl<'a> Clone for IndexPage<'a>","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Clone for McaptchaConfig","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Clone for Level","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Clone for Server","synthetic":false,"types":["mcaptcha::settings::Server"]},{"text":"impl Clone for Captcha","synthetic":false,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Clone for Smtp","synthetic":false,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Clone for DatabaseBuilder","synthetic":false,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Clone for Database","synthetic":false,"types":["mcaptcha::settings::Database"]},{"text":"impl Clone for Redis","synthetic":false,"types":["mcaptcha::settings::Redis"]},{"text":"impl Clone for Settings","synthetic":false,"types":["mcaptcha::settings::Settings"]},{"text":"impl Clone for Stats","synthetic":false,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Clone for IndexPage","synthetic":false,"types":["mcaptcha::widget::IndexPage"]}]; implementors["tests_migrate"] = [{"text":"impl Clone for Server","synthetic":false,"types":["tests_migrate::settings::Server"]},{"text":"impl Clone for Captcha","synthetic":false,"types":["tests_migrate::settings::Captcha"]},{"text":"impl Clone for Smtp","synthetic":false,"types":["tests_migrate::settings::Smtp"]},{"text":"impl Clone for DatabaseBuilder","synthetic":false,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl Clone for Database","synthetic":false,"types":["tests_migrate::settings::Database"]},{"text":"impl Clone for Redis","synthetic":false,"types":["tests_migrate::settings::Redis"]},{"text":"impl Clone for Settings","synthetic":false,"types":["tests_migrate::settings::Settings"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/cmp/trait.PartialEq.js b/implementors/core/cmp/trait.PartialEq.js index 04daa040..f64978d8 100644 --- a/implementors/core/cmp/trait.PartialEq.js +++ b/implementors/core/cmp/trait.PartialEq.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl PartialEq<ServiceError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl PartialEq<PageError> for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; +implementors["mcaptcha"] = [{"text":"impl PartialEq<SmtpErrorWrapper> for SmtpErrorWrapper","synthetic":false,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl PartialEq<ServiceError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl PartialEq<PageError> for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/convert/trait.From.js b/implementors/core/convert/trait.From.js index 581a09cf..e9836331 100644 --- a/implementors/core/convert/trait.From.js +++ b/implementors/core/convert/trait.From.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl From<UninitializedFieldError> for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl From<String> for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl From<UninitializedFieldError> for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl From<String> for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl From<Notification> for NotificationResp","synthetic":false,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl From<CredsError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<ValidationErrors> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<ParseError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<CaptchaError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<Error> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<Error> for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]},{"text":"impl From<ServiceError> for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; +implementors["mcaptcha"] = [{"text":"impl From<UninitializedFieldError> for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl From<String> for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl From<UninitializedFieldError> for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl From<String> for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl From<Notification> for NotificationResp","synthetic":false,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl From<CredsError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<ValidationErrors> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<ParseError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<CaptchaError> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<Error> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<Error> for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl From<Error> for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]},{"text":"impl From<ServiceError> for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/fmt/trait.Debug.js b/implementors/core/fmt/trait.Debug.js index 9165a322..85547a4b 100644 --- a/implementors/core/fmt/trait.Debug.js +++ b/implementors/core/fmt/trait.Debug.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Debug for Email","synthetic":false,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Debug for Secret","synthetic":false,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Debug for AccountCheckPayload","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Debug for AccountCheckResp","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Debug for Register","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Debug for Login","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Debug for Password","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Debug for MCaptchaID","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Debug for MCaptchaDetails","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Debug for Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Debug for I32Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Debug for BuildDetails","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Debug for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Debug for Health","synthetic":false,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Debug for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Debug for GetConfigPayload","synthetic":false,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Debug for ValidationToken","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Debug for CaptchaValidateResp","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Debug for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Debug for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]},{"text":"impl Debug for Server","synthetic":false,"types":["mcaptcha::settings::Server"]},{"text":"impl Debug for Captcha","synthetic":false,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Debug for Smtp","synthetic":false,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Debug for DatabaseBuilder","synthetic":false,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Debug for Database","synthetic":false,"types":["mcaptcha::settings::Database"]},{"text":"impl Debug for Redis","synthetic":false,"types":["mcaptcha::settings::Redis"]},{"text":"impl Debug for Settings","synthetic":false,"types":["mcaptcha::settings::Settings"]},{"text":"impl Debug for Stats","synthetic":false,"types":["mcaptcha::stats::fetch::Stats"]}]; +implementors["mcaptcha"] = [{"text":"impl Debug for Email","synthetic":false,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Debug for Secret","synthetic":false,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Debug for AccountCheckPayload","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Debug for AccountCheckResp","synthetic":false,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Debug for Register","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Debug for Login","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Debug for Password","synthetic":false,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Debug for MCaptchaID","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Debug for MCaptchaDetails","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Debug for Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Debug for I32Levels","synthetic":false,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Debug for BuildDetails","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Debug for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Debug for Health","synthetic":false,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Debug for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Debug for GetConfigPayload","synthetic":false,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Debug for ValidationToken","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Debug for CaptchaValidateResp","synthetic":false,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Debug for SmtpErrorWrapper","synthetic":false,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl Debug for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Debug for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]},{"text":"impl Debug for Server","synthetic":false,"types":["mcaptcha::settings::Server"]},{"text":"impl Debug for Captcha","synthetic":false,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Debug for Smtp","synthetic":false,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Debug for DatabaseBuilder","synthetic":false,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Debug for Database","synthetic":false,"types":["mcaptcha::settings::Database"]},{"text":"impl Debug for Redis","synthetic":false,"types":["mcaptcha::settings::Redis"]},{"text":"impl Debug for Settings","synthetic":false,"types":["mcaptcha::settings::Settings"]},{"text":"impl Debug for Stats","synthetic":false,"types":["mcaptcha::stats::fetch::Stats"]}]; implementors["tests_migrate"] = [{"text":"impl Debug for Server","synthetic":false,"types":["tests_migrate::settings::Server"]},{"text":"impl Debug for Captcha","synthetic":false,"types":["tests_migrate::settings::Captcha"]},{"text":"impl Debug for Smtp","synthetic":false,"types":["tests_migrate::settings::Smtp"]},{"text":"impl Debug for DatabaseBuilder","synthetic":false,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl Debug for Database","synthetic":false,"types":["tests_migrate::settings::Database"]},{"text":"impl Debug for Redis","synthetic":false,"types":["tests_migrate::settings::Redis"]},{"text":"impl Debug for Settings","synthetic":false,"types":["tests_migrate::settings::Settings"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/fmt/trait.Display.js b/implementors/core/fmt/trait.Display.js index c5df483a..ac1deb38 100644 --- a/implementors/core/fmt/trait.Display.js +++ b/implementors/core/fmt/trait.Display.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Display for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Display for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Display for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Display for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; +implementors["mcaptcha"] = [{"text":"impl Display for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Display for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Display for SmtpErrorWrapper","synthetic":false,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl Display for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Display for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/marker/trait.Freeze.js b/implementors/core/marker/trait.Freeze.js index c75be3bf..d8645432 100644 --- a/implementors/core/marker/trait.Freeze.js +++ b/implementors/core/marker/trait.Freeze.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Freeze for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Freeze for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Freeze for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Freeze for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Freeze for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Freeze for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Freeze for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Freeze for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Freeze for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Freeze for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Freeze for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Freeze for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Freeze for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Freeze for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Freeze for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Freeze for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Freeze for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Freeze for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Freeze for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Freeze for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Freeze for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Freeze for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Freeze for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Freeze for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Freeze for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Freeze for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Freeze for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Freeze for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Freeze for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Freeze for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Freeze for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Freeze for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Freeze for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Freeze for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Freeze for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Freeze for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Freeze for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Freeze for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Freeze for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Freeze for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Freeze for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Freeze for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Freeze for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Freeze for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Freeze for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Freeze for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Freeze for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Freeze for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Freeze for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Freeze for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Freeze for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Freeze for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Freeze for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Freeze for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Freeze for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Freeze for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Freeze for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Freeze for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Freeze for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Freeze for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Freeze for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Freeze for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Freeze for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Freeze for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Freeze for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Freeze for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Freeze for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Freeze for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Freeze for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl Freeze for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Freeze for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Freeze for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Freeze for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Freeze for CheckLoginMiddleware<S> where
    S: Freeze
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Freeze for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Freeze for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Freeze for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Freeze for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Freeze for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Freeze for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Freeze for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Freeze for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Freeze for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Freeze for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Freeze for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Freeze for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Freeze for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Freeze for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Freeze for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Freeze for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Freeze for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Freeze for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Freeze for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Freeze for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Freeze for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Freeze for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Freeze for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Freeze for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Freeze for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Freeze for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Freeze for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Freeze for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Freeze for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Freeze for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Freeze for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Freeze for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Freeze for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Freeze for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Freeze for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Freeze for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Freeze for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Freeze for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Freeze for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Freeze for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Freeze for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Freeze for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Freeze for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Freeze for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Freeze for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Freeze for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Freeze for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; +implementors["mcaptcha"] = [{"text":"impl Freeze for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Freeze for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Freeze for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Freeze for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Freeze for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Freeze for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Freeze for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Freeze for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Freeze for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Freeze for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Freeze for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Freeze for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Freeze for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Freeze for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Freeze for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Freeze for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Freeze for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Freeze for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Freeze for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Freeze for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Freeze for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Freeze for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Freeze for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Freeze for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Freeze for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Freeze for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Freeze for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Freeze for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Freeze for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Freeze for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Freeze for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Freeze for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Freeze for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Freeze for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Freeze for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Freeze for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Freeze for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Freeze for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Freeze for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Freeze for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Freeze for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Freeze for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Freeze for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Freeze for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Freeze for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Freeze for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Freeze for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Freeze for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Freeze for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Freeze for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Freeze for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Freeze for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Freeze for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Freeze for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Freeze for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Freeze for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Freeze for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Freeze for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Freeze for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Freeze for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Freeze for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Freeze for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Freeze for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Freeze for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Freeze for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Freeze for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Freeze for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Freeze for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Freeze for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl<'a> Freeze for IndexPage<'a>","synthetic":true,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl Freeze for SmtpErrorWrapper","synthetic":true,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl Freeze for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Freeze for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Freeze for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Freeze for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Freeze for CheckLoginMiddleware<S> where
    S: Freeze
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Freeze for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Freeze for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Freeze for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Freeze for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Freeze for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Freeze for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Freeze for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Freeze for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Freeze for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Freeze for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Freeze for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Freeze for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Freeze for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Freeze for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Freeze for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Freeze for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Freeze for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Freeze for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Freeze for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Freeze for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Freeze for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Freeze for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Freeze for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Freeze for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Freeze for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Freeze for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Freeze for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Freeze for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Freeze for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Freeze for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Freeze for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Freeze for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Freeze for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Freeze for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Freeze for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Freeze for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Freeze for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Freeze for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Freeze for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Freeze for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Freeze for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Freeze for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Freeze for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Freeze for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Freeze for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Freeze for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Freeze for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Freeze for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; implementors["tests_migrate"] = [{"text":"impl Freeze for SystemGroup","synthetic":true,"types":["tests_migrate::data::SystemGroup"]},{"text":"impl Freeze for Data","synthetic":true,"types":["tests_migrate::data::Data"]},{"text":"impl Freeze for Server","synthetic":true,"types":["tests_migrate::settings::Server"]},{"text":"impl Freeze for Captcha","synthetic":true,"types":["tests_migrate::settings::Captcha"]},{"text":"impl Freeze for Smtp","synthetic":true,"types":["tests_migrate::settings::Smtp"]},{"text":"impl Freeze for DatabaseBuilder","synthetic":true,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl Freeze for Database","synthetic":true,"types":["tests_migrate::settings::Database"]},{"text":"impl Freeze for Redis","synthetic":true,"types":["tests_migrate::settings::Redis"]},{"text":"impl Freeze for Settings","synthetic":true,"types":["tests_migrate::settings::Settings"]},{"text":"impl Freeze for SETTINGS","synthetic":true,"types":["tests_migrate::SETTINGS"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/marker/trait.Send.js b/implementors/core/marker/trait.Send.js index 074d34dd..04fbc46d 100644 --- a/implementors/core/marker/trait.Send.js +++ b/implementors/core/marker/trait.Send.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Send for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Send for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Send for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Send for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Send for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Send for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Send for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Send for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Send for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Send for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Send for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Send for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Send for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Send for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Send for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Send for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Send for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Send for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Send for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Send for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Send for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Send for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Send for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Send for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Send for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Send for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Send for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Send for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Send for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Send for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Send for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Send for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Send for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Send for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Send for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Send for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Send for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Send for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Send for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Send for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Send for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Send for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Send for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Send for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Send for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Send for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Send for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Send for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Send for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Send for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Send for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Send for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Send for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Send for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Send for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Send for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Send for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Send for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Send for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Send for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Send for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Send for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Send for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Send for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Send for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Send for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Send for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Send for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Send for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl Send for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Send for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Send for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Send for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Send for CheckLoginMiddleware<S> where
    S: Send
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Send for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Send for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Send for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Send for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Send for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Send for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Send for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Send for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Send for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Send for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Send for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Send for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Send for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Send for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Send for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Send for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Send for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Send for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Send for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Send for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Send for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Send for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Send for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Send for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Send for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Send for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Send for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Send for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Send for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Send for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Send for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Send for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Send for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Send for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Send for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Send for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Send for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Send for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Send for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Send for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Send for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Send for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Send for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Send for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Send for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Send for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Send for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; +implementors["mcaptcha"] = [{"text":"impl Send for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Send for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Send for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Send for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Send for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Send for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Send for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Send for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Send for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Send for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Send for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Send for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Send for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Send for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Send for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Send for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Send for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Send for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Send for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Send for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Send for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Send for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Send for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Send for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Send for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Send for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Send for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Send for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Send for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Send for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Send for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Send for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Send for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Send for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Send for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Send for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Send for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Send for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Send for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Send for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Send for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Send for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Send for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Send for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Send for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Send for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Send for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Send for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Send for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Send for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Send for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Send for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Send for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Send for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Send for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Send for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Send for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Send for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Send for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Send for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Send for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Send for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Send for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Send for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Send for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Send for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Send for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Send for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Send for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl<'a> Send for IndexPage<'a>","synthetic":true,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl Send for SmtpErrorWrapper","synthetic":true,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl Send for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Send for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Send for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Send for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Send for CheckLoginMiddleware<S> where
    S: Send
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Send for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Send for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Send for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Send for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Send for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Send for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Send for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Send for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Send for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Send for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Send for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Send for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Send for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Send for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Send for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Send for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Send for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Send for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Send for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Send for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Send for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Send for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Send for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Send for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Send for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Send for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Send for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Send for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Send for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Send for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Send for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Send for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Send for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Send for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Send for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Send for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Send for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Send for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Send for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Send for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Send for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Send for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Send for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Send for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Send for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Send for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Send for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Send for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; implementors["tests_migrate"] = [{"text":"impl Send for SystemGroup","synthetic":true,"types":["tests_migrate::data::SystemGroup"]},{"text":"impl Send for Data","synthetic":true,"types":["tests_migrate::data::Data"]},{"text":"impl Send for Server","synthetic":true,"types":["tests_migrate::settings::Server"]},{"text":"impl Send for Captcha","synthetic":true,"types":["tests_migrate::settings::Captcha"]},{"text":"impl Send for Smtp","synthetic":true,"types":["tests_migrate::settings::Smtp"]},{"text":"impl Send for DatabaseBuilder","synthetic":true,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl Send for Database","synthetic":true,"types":["tests_migrate::settings::Database"]},{"text":"impl Send for Redis","synthetic":true,"types":["tests_migrate::settings::Redis"]},{"text":"impl Send for Settings","synthetic":true,"types":["tests_migrate::settings::Settings"]},{"text":"impl Send for SETTINGS","synthetic":true,"types":["tests_migrate::SETTINGS"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/marker/trait.Sync.js b/implementors/core/marker/trait.Sync.js index 5d514774..0e58676b 100644 --- a/implementors/core/marker/trait.Sync.js +++ b/implementors/core/marker/trait.Sync.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Sync for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Sync for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Sync for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Sync for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Sync for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Sync for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Sync for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Sync for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Sync for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Sync for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Sync for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Sync for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Sync for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Sync for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Sync for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Sync for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Sync for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Sync for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Sync for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Sync for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Sync for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Sync for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Sync for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Sync for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Sync for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Sync for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Sync for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Sync for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Sync for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Sync for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Sync for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Sync for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Sync for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Sync for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Sync for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Sync for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Sync for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Sync for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Sync for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Sync for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Sync for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Sync for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Sync for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Sync for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Sync for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Sync for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Sync for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Sync for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Sync for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Sync for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Sync for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Sync for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Sync for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Sync for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Sync for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Sync for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Sync for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Sync for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Sync for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Sync for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Sync for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Sync for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Sync for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Sync for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Sync for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Sync for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Sync for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Sync for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Sync for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl Sync for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Sync for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Sync for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Sync for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Sync for CheckLoginMiddleware<S> where
    S: Sync
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Sync for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Sync for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Sync for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Sync for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Sync for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Sync for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Sync for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Sync for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Sync for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Sync for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Sync for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Sync for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Sync for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Sync for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Sync for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Sync for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Sync for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Sync for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Sync for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Sync for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Sync for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Sync for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Sync for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Sync for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Sync for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Sync for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Sync for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Sync for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Sync for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Sync for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Sync for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Sync for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Sync for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Sync for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Sync for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Sync for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Sync for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Sync for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Sync for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Sync for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Sync for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Sync for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Sync for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Sync for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Sync for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Sync for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Sync for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; +implementors["mcaptcha"] = [{"text":"impl Sync for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Sync for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Sync for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Sync for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Sync for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Sync for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Sync for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Sync for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Sync for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Sync for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Sync for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Sync for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Sync for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Sync for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Sync for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Sync for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Sync for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Sync for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Sync for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Sync for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Sync for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Sync for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Sync for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Sync for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Sync for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Sync for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Sync for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Sync for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Sync for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Sync for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Sync for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Sync for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Sync for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Sync for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Sync for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Sync for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Sync for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Sync for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Sync for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Sync for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Sync for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Sync for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Sync for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Sync for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Sync for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Sync for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Sync for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Sync for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Sync for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Sync for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Sync for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Sync for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Sync for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Sync for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Sync for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Sync for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Sync for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Sync for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Sync for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Sync for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Sync for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Sync for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Sync for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Sync for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Sync for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Sync for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Sync for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Sync for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Sync for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl<'a> Sync for IndexPage<'a>","synthetic":true,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl Sync for SmtpErrorWrapper","synthetic":true,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl Sync for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Sync for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Sync for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Sync for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Sync for CheckLoginMiddleware<S> where
    S: Sync
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Sync for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Sync for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Sync for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Sync for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Sync for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Sync for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Sync for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Sync for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Sync for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Sync for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Sync for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Sync for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Sync for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Sync for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Sync for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Sync for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Sync for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Sync for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Sync for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Sync for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Sync for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Sync for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Sync for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Sync for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Sync for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Sync for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Sync for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Sync for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Sync for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Sync for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Sync for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Sync for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Sync for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Sync for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Sync for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Sync for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Sync for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Sync for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Sync for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Sync for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Sync for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Sync for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Sync for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Sync for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Sync for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Sync for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Sync for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Sync for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; implementors["tests_migrate"] = [{"text":"impl Sync for SystemGroup","synthetic":true,"types":["tests_migrate::data::SystemGroup"]},{"text":"impl Sync for Data","synthetic":true,"types":["tests_migrate::data::Data"]},{"text":"impl Sync for Server","synthetic":true,"types":["tests_migrate::settings::Server"]},{"text":"impl Sync for Captcha","synthetic":true,"types":["tests_migrate::settings::Captcha"]},{"text":"impl Sync for Smtp","synthetic":true,"types":["tests_migrate::settings::Smtp"]},{"text":"impl Sync for DatabaseBuilder","synthetic":true,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl Sync for Database","synthetic":true,"types":["tests_migrate::settings::Database"]},{"text":"impl Sync for Redis","synthetic":true,"types":["tests_migrate::settings::Redis"]},{"text":"impl Sync for Settings","synthetic":true,"types":["tests_migrate::settings::Settings"]},{"text":"impl Sync for SETTINGS","synthetic":true,"types":["tests_migrate::SETTINGS"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/core/marker/trait.Unpin.js b/implementors/core/marker/trait.Unpin.js index 2eccc78b..e2770843 100644 --- a/implementors/core/marker/trait.Unpin.js +++ b/implementors/core/marker/trait.Unpin.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Unpin for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Unpin for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Unpin for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Unpin for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Unpin for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Unpin for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Unpin for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Unpin for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Unpin for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Unpin for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Unpin for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Unpin for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Unpin for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Unpin for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Unpin for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Unpin for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Unpin for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Unpin for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Unpin for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Unpin for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Unpin for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Unpin for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Unpin for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Unpin for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Unpin for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Unpin for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Unpin for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Unpin for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Unpin for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Unpin for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Unpin for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Unpin for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Unpin for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Unpin for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Unpin for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Unpin for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Unpin for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Unpin for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Unpin for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Unpin for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Unpin for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Unpin for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Unpin for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Unpin for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Unpin for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Unpin for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Unpin for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Unpin for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Unpin for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Unpin for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Unpin for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Unpin for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Unpin for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Unpin for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Unpin for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Unpin for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Unpin for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Unpin for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Unpin for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Unpin for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Unpin for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Unpin for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Unpin for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Unpin for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Unpin for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Unpin for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Unpin for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Unpin for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Unpin for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl Unpin for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Unpin for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Unpin for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Unpin for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Unpin for CheckLoginMiddleware<S> where
    S: Unpin
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Unpin for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Unpin for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Unpin for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Unpin for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Unpin for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Unpin for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Unpin for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Unpin for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Unpin for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Unpin for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Unpin for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Unpin for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Unpin for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Unpin for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Unpin for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Unpin for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Unpin for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Unpin for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Unpin for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Unpin for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Unpin for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Unpin for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Unpin for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Unpin for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Unpin for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Unpin for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Unpin for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Unpin for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Unpin for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Unpin for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Unpin for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Unpin for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Unpin for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Unpin for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Unpin for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Unpin for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Unpin for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Unpin for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Unpin for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Unpin for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Unpin for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Unpin for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Unpin for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Unpin for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Unpin for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Unpin for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Unpin for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; +implementors["mcaptcha"] = [{"text":"impl Unpin for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl Unpin for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl Unpin for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl Unpin for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl Unpin for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl Unpin for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl Unpin for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl Unpin for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl Unpin for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl Unpin for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl Unpin for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl Unpin for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl Unpin for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl Unpin for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl Unpin for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl Unpin for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl Unpin for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl Unpin for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl Unpin for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl Unpin for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl Unpin for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl Unpin for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl Unpin for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl Unpin for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl Unpin for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl Unpin for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl Unpin for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl Unpin for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl Unpin for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl Unpin for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl Unpin for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl Unpin for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl Unpin for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl Unpin for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl Unpin for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl Unpin for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl Unpin for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl Unpin for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl Unpin for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl Unpin for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl Unpin for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl Unpin for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl Unpin for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Unpin for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl Unpin for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl Unpin for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl Unpin for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Unpin for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl Unpin for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl Unpin for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl Unpin for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl Unpin for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl Unpin for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl Unpin for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl Unpin for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl Unpin for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl Unpin for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl Unpin for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl Unpin for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl Unpin for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl Unpin for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl Unpin for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl Unpin for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl Unpin for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl Unpin for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl Unpin for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl Unpin for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl Unpin for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl Unpin for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl<'a> Unpin for IndexPage<'a>","synthetic":true,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl Unpin for SmtpErrorWrapper","synthetic":true,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl Unpin for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Unpin for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl Unpin for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl Unpin for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> Unpin for CheckLoginMiddleware<S> where
    S: Unpin
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Unpin for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl Unpin for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl Unpin for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl Unpin for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl Unpin for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl Unpin for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> Unpin for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl Unpin for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl Unpin for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl Unpin for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> Unpin for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Unpin for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Unpin for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl Unpin for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl Unpin for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Unpin for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl Unpin for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl Unpin for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Unpin for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl Unpin for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl Unpin for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl Unpin for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl Unpin for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl Unpin for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl Unpin for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl Unpin for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl Unpin for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl Unpin for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl Unpin for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl Unpin for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl Unpin for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl Unpin for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl Unpin for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl Unpin for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl Unpin for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl Unpin for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl Unpin for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl Unpin for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl Unpin for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl Unpin for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl Unpin for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl Unpin for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl Unpin for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl Unpin for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl Unpin for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl Unpin for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl Unpin for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl Unpin for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; implementors["tests_migrate"] = [{"text":"impl Unpin for SystemGroup","synthetic":true,"types":["tests_migrate::data::SystemGroup"]},{"text":"impl Unpin for Data","synthetic":true,"types":["tests_migrate::data::Data"]},{"text":"impl Unpin for Server","synthetic":true,"types":["tests_migrate::settings::Server"]},{"text":"impl Unpin for Captcha","synthetic":true,"types":["tests_migrate::settings::Captcha"]},{"text":"impl Unpin for Smtp","synthetic":true,"types":["tests_migrate::settings::Smtp"]},{"text":"impl Unpin for DatabaseBuilder","synthetic":true,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl Unpin for Database","synthetic":true,"types":["tests_migrate::settings::Database"]},{"text":"impl Unpin for Redis","synthetic":true,"types":["tests_migrate::settings::Redis"]},{"text":"impl Unpin for Settings","synthetic":true,"types":["tests_migrate::settings::Settings"]},{"text":"impl Unpin for SETTINGS","synthetic":true,"types":["tests_migrate::SETTINGS"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/sailfish/private/trait.Sealed.js b/implementors/sailfish/private/trait.Sealed.js index 629cecd4..895a73b7 100644 --- a/implementors/sailfish/private/trait.Sealed.js +++ b/implementors/sailfish/private/trait.Sealed.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl<'a> Sealed for ErrorPage<'a>","synthetic":false,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl<'a> Sealed for IndexPage<'a>","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::widget::IndexPage"]}]; +implementors["mcaptcha"] = [{"text":"impl<'a> Sealed for IndexPage<'a>","synthetic":false,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl<'a> Sealed for ErrorPage<'a>","synthetic":false,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl<'a> Sealed for IndexPage<'a>","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl Sealed for IndexPage","synthetic":false,"types":["mcaptcha::widget::IndexPage"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/sailfish/trait.TemplateOnce.js b/implementors/sailfish/trait.TemplateOnce.js index 5a960740..491ef889 100644 --- a/implementors/sailfish/trait.TemplateOnce.js +++ b/implementors/sailfish/trait.TemplateOnce.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl<'a> TemplateOnce for ErrorPage<'a>","synthetic":false,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl<'a> TemplateOnce for IndexPage<'a>","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::widget::IndexPage"]}]; +implementors["mcaptcha"] = [{"text":"impl<'a> TemplateOnce for IndexPage<'a>","synthetic":false,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl<'a> TemplateOnce for ErrorPage<'a>","synthetic":false,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl<'a> TemplateOnce for IndexPage<'a>","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl TemplateOnce for IndexPage","synthetic":false,"types":["mcaptcha::widget::IndexPage"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/std/error/trait.Error.js b/implementors/std/error/trait.Error.js index 95565bca..399664df 100644 --- a/implementors/std/error/trait.Error.js +++ b/implementors/std/error/trait.Error.js @@ -1,3 +1,3 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl Error for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Error for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Error for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Error for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; +implementors["mcaptcha"] = [{"text":"impl Error for BuildDetailsBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl Error for HealthBuilderError","synthetic":false,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl Error for SmtpErrorWrapper","synthetic":false,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl Error for ServiceError","synthetic":false,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl Error for PageError","synthetic":false,"types":["mcaptcha::errors::PageError"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/std/panic/trait.RefUnwindSafe.js b/implementors/std/panic/trait.RefUnwindSafe.js index aa4de5e1..20bed823 100644 --- a/implementors/std/panic/trait.RefUnwindSafe.js +++ b/implementors/std/panic/trait.RefUnwindSafe.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl RefUnwindSafe for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl RefUnwindSafe for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl RefUnwindSafe for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl RefUnwindSafe for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl RefUnwindSafe for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl RefUnwindSafe for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl RefUnwindSafe for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl RefUnwindSafe for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl RefUnwindSafe for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl RefUnwindSafe for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl RefUnwindSafe for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl RefUnwindSafe for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl RefUnwindSafe for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl RefUnwindSafe for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl RefUnwindSafe for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl RefUnwindSafe for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl RefUnwindSafe for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl RefUnwindSafe for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl RefUnwindSafe for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl RefUnwindSafe for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl RefUnwindSafe for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl RefUnwindSafe for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl RefUnwindSafe for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl RefUnwindSafe for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl RefUnwindSafe for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl RefUnwindSafe for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl RefUnwindSafe for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl RefUnwindSafe for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl RefUnwindSafe for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl RefUnwindSafe for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl RefUnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl RefUnwindSafe for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl RefUnwindSafe for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl RefUnwindSafe for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl RefUnwindSafe for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl RefUnwindSafe for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl RefUnwindSafe for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl RefUnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl RefUnwindSafe for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl RefUnwindSafe for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl RefUnwindSafe for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl RefUnwindSafe for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl RefUnwindSafe for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl RefUnwindSafe for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl RefUnwindSafe for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl RefUnwindSafe for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl RefUnwindSafe for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl RefUnwindSafe for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl RefUnwindSafe for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl RefUnwindSafe for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl RefUnwindSafe for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl RefUnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl RefUnwindSafe for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl RefUnwindSafe for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl RefUnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl RefUnwindSafe for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl RefUnwindSafe for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl RefUnwindSafe for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl RefUnwindSafe for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl RefUnwindSafe for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl RefUnwindSafe for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl RefUnwindSafe for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl RefUnwindSafe for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl RefUnwindSafe for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl RefUnwindSafe for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl !RefUnwindSafe for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl !RefUnwindSafe for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl RefUnwindSafe for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl RefUnwindSafe for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl !RefUnwindSafe for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl RefUnwindSafe for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl !RefUnwindSafe for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl RefUnwindSafe for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> RefUnwindSafe for CheckLoginMiddleware<S> where
    S: RefUnwindSafe
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl RefUnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl RefUnwindSafe for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl RefUnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl RefUnwindSafe for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl RefUnwindSafe for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl RefUnwindSafe for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> RefUnwindSafe for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl RefUnwindSafe for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl RefUnwindSafe for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl RefUnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> RefUnwindSafe for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl RefUnwindSafe for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl RefUnwindSafe for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl RefUnwindSafe for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl RefUnwindSafe for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl RefUnwindSafe for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl RefUnwindSafe for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl RefUnwindSafe for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl RefUnwindSafe for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl RefUnwindSafe for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl RefUnwindSafe for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl RefUnwindSafe for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl RefUnwindSafe for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl RefUnwindSafe for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl RefUnwindSafe for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl RefUnwindSafe for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl RefUnwindSafe for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl RefUnwindSafe for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl RefUnwindSafe for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl RefUnwindSafe for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl RefUnwindSafe for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl RefUnwindSafe for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl RefUnwindSafe for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl RefUnwindSafe for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl RefUnwindSafe for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl RefUnwindSafe for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl RefUnwindSafe for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl RefUnwindSafe for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl RefUnwindSafe for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl RefUnwindSafe for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl RefUnwindSafe for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl RefUnwindSafe for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl RefUnwindSafe for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl RefUnwindSafe for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl RefUnwindSafe for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl RefUnwindSafe for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl RefUnwindSafe for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; +implementors["mcaptcha"] = [{"text":"impl RefUnwindSafe for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl RefUnwindSafe for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl RefUnwindSafe for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl RefUnwindSafe for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl RefUnwindSafe for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl RefUnwindSafe for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl RefUnwindSafe for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl RefUnwindSafe for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl RefUnwindSafe for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl RefUnwindSafe for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl RefUnwindSafe for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl RefUnwindSafe for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl RefUnwindSafe for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl RefUnwindSafe for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl RefUnwindSafe for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl RefUnwindSafe for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl RefUnwindSafe for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl RefUnwindSafe for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl RefUnwindSafe for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl RefUnwindSafe for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl RefUnwindSafe for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl RefUnwindSafe for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl RefUnwindSafe for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl RefUnwindSafe for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl RefUnwindSafe for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl RefUnwindSafe for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl RefUnwindSafe for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl RefUnwindSafe for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl RefUnwindSafe for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl RefUnwindSafe for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl RefUnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl RefUnwindSafe for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl RefUnwindSafe for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl RefUnwindSafe for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl RefUnwindSafe for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl RefUnwindSafe for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl RefUnwindSafe for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl RefUnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl RefUnwindSafe for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl RefUnwindSafe for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl RefUnwindSafe for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl RefUnwindSafe for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl RefUnwindSafe for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl RefUnwindSafe for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl RefUnwindSafe for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl RefUnwindSafe for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl RefUnwindSafe for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl RefUnwindSafe for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl RefUnwindSafe for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl RefUnwindSafe for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl RefUnwindSafe for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl RefUnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl RefUnwindSafe for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl RefUnwindSafe for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl RefUnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl RefUnwindSafe for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl RefUnwindSafe for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl RefUnwindSafe for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl RefUnwindSafe for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl RefUnwindSafe for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl RefUnwindSafe for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl RefUnwindSafe for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl RefUnwindSafe for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl RefUnwindSafe for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl RefUnwindSafe for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl !RefUnwindSafe for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl !RefUnwindSafe for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl RefUnwindSafe for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl RefUnwindSafe for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl<'a> RefUnwindSafe for IndexPage<'a>","synthetic":true,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl !RefUnwindSafe for SmtpErrorWrapper","synthetic":true,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl !RefUnwindSafe for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl RefUnwindSafe for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl !RefUnwindSafe for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl RefUnwindSafe for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> RefUnwindSafe for CheckLoginMiddleware<S> where
    S: RefUnwindSafe
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl RefUnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl RefUnwindSafe for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl RefUnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl RefUnwindSafe for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl RefUnwindSafe for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl RefUnwindSafe for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> RefUnwindSafe for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl RefUnwindSafe for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl RefUnwindSafe for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl RefUnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> RefUnwindSafe for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl RefUnwindSafe for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl RefUnwindSafe for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl RefUnwindSafe for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl RefUnwindSafe for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl RefUnwindSafe for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl RefUnwindSafe for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl RefUnwindSafe for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl RefUnwindSafe for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl RefUnwindSafe for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl RefUnwindSafe for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl RefUnwindSafe for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl RefUnwindSafe for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl RefUnwindSafe for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl RefUnwindSafe for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl RefUnwindSafe for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl RefUnwindSafe for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl RefUnwindSafe for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl RefUnwindSafe for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl RefUnwindSafe for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl RefUnwindSafe for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl RefUnwindSafe for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl RefUnwindSafe for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl RefUnwindSafe for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl RefUnwindSafe for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl RefUnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl RefUnwindSafe for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl RefUnwindSafe for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl RefUnwindSafe for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl RefUnwindSafe for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl RefUnwindSafe for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl RefUnwindSafe for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl RefUnwindSafe for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl RefUnwindSafe for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl RefUnwindSafe for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl RefUnwindSafe for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl RefUnwindSafe for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl RefUnwindSafe for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; implementors["tests_migrate"] = [{"text":"impl !RefUnwindSafe for SystemGroup","synthetic":true,"types":["tests_migrate::data::SystemGroup"]},{"text":"impl !RefUnwindSafe for Data","synthetic":true,"types":["tests_migrate::data::Data"]},{"text":"impl RefUnwindSafe for Server","synthetic":true,"types":["tests_migrate::settings::Server"]},{"text":"impl RefUnwindSafe for Captcha","synthetic":true,"types":["tests_migrate::settings::Captcha"]},{"text":"impl RefUnwindSafe for Smtp","synthetic":true,"types":["tests_migrate::settings::Smtp"]},{"text":"impl RefUnwindSafe for DatabaseBuilder","synthetic":true,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl RefUnwindSafe for Database","synthetic":true,"types":["tests_migrate::settings::Database"]},{"text":"impl RefUnwindSafe for Redis","synthetic":true,"types":["tests_migrate::settings::Redis"]},{"text":"impl RefUnwindSafe for Settings","synthetic":true,"types":["tests_migrate::settings::Settings"]},{"text":"impl RefUnwindSafe for SETTINGS","synthetic":true,"types":["tests_migrate::SETTINGS"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/implementors/std/panic/trait.UnwindSafe.js b/implementors/std/panic/trait.UnwindSafe.js index b6b96773..c774bf2d 100644 --- a/implementors/std/panic/trait.UnwindSafe.js +++ b/implementors/std/panic/trait.UnwindSafe.js @@ -1,4 +1,4 @@ (function() {var implementors = {}; -implementors["mcaptcha"] = [{"text":"impl UnwindSafe for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl UnwindSafe for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl UnwindSafe for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl UnwindSafe for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl UnwindSafe for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl UnwindSafe for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl UnwindSafe for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl UnwindSafe for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl UnwindSafe for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl UnwindSafe for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl UnwindSafe for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl UnwindSafe for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl UnwindSafe for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl UnwindSafe for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl UnwindSafe for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl UnwindSafe for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl UnwindSafe for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl UnwindSafe for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl UnwindSafe for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl UnwindSafe for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl UnwindSafe for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl UnwindSafe for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl UnwindSafe for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl UnwindSafe for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl UnwindSafe for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl UnwindSafe for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl UnwindSafe for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl UnwindSafe for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl UnwindSafe for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl UnwindSafe for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl UnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl UnwindSafe for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl UnwindSafe for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl UnwindSafe for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl UnwindSafe for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl UnwindSafe for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl UnwindSafe for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl UnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl UnwindSafe for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl UnwindSafe for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl UnwindSafe for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl UnwindSafe for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl UnwindSafe for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl UnwindSafe for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl UnwindSafe for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl UnwindSafe for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl UnwindSafe for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl UnwindSafe for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl UnwindSafe for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl UnwindSafe for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl UnwindSafe for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl UnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl UnwindSafe for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl UnwindSafe for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl UnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl UnwindSafe for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl UnwindSafe for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl UnwindSafe for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl UnwindSafe for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl UnwindSafe for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl UnwindSafe for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl UnwindSafe for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl UnwindSafe for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl UnwindSafe for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl UnwindSafe for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl !UnwindSafe for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl !UnwindSafe for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl UnwindSafe for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl UnwindSafe for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl !UnwindSafe for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl UnwindSafe for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl !UnwindSafe for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl UnwindSafe for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> UnwindSafe for CheckLoginMiddleware<S> where
    S: UnwindSafe
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl UnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl UnwindSafe for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl UnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl UnwindSafe for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl UnwindSafe for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl UnwindSafe for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> UnwindSafe for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl UnwindSafe for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl UnwindSafe for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl UnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> UnwindSafe for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl UnwindSafe for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl UnwindSafe for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl UnwindSafe for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl UnwindSafe for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl UnwindSafe for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl UnwindSafe for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl UnwindSafe for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl UnwindSafe for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl UnwindSafe for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl UnwindSafe for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl UnwindSafe for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl UnwindSafe for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl UnwindSafe for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl UnwindSafe for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl UnwindSafe for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl UnwindSafe for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl UnwindSafe for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl UnwindSafe for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl UnwindSafe for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl UnwindSafe for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl UnwindSafe for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl UnwindSafe for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl UnwindSafe for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl UnwindSafe for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl UnwindSafe for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl UnwindSafe for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl UnwindSafe for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl UnwindSafe for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl UnwindSafe for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl UnwindSafe for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl UnwindSafe for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl UnwindSafe for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl UnwindSafe for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl UnwindSafe for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl UnwindSafe for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl UnwindSafe for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; +implementors["mcaptcha"] = [{"text":"impl UnwindSafe for delete_account","synthetic":true,"types":["mcaptcha::api::v1::account::delete::delete_account"]},{"text":"impl UnwindSafe for Email","synthetic":true,"types":["mcaptcha::api::v1::account::email::Email"]},{"text":"impl UnwindSafe for email_exists","synthetic":true,"types":["mcaptcha::api::v1::account::email::email_exists"]},{"text":"impl UnwindSafe for set_email","synthetic":true,"types":["mcaptcha::api::v1::account::email::set_email"]},{"text":"impl UnwindSafe for Secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::Secret"]},{"text":"impl UnwindSafe for get_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::get_secret"]},{"text":"impl UnwindSafe for update_user_secret","synthetic":true,"types":["mcaptcha::api::v1::account::secret::update_user_secret"]},{"text":"impl UnwindSafe for username_exists","synthetic":true,"types":["mcaptcha::api::v1::account::username::username_exists"]},{"text":"impl UnwindSafe for Account","synthetic":true,"types":["mcaptcha::api::v1::account::routes::Account"]},{"text":"impl UnwindSafe for AccountCheckPayload","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckPayload"]},{"text":"impl UnwindSafe for AccountCheckResp","synthetic":true,"types":["mcaptcha::api::v1::account::AccountCheckResp"]},{"text":"impl UnwindSafe for Auth","synthetic":true,"types":["mcaptcha::api::v1::auth::routes::Auth"]},{"text":"impl UnwindSafe for Register","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Register"]},{"text":"impl UnwindSafe for Login","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Login"]},{"text":"impl UnwindSafe for Password","synthetic":true,"types":["mcaptcha::api::v1::auth::runners::Password"]},{"text":"impl UnwindSafe for register","synthetic":true,"types":["mcaptcha::api::v1::auth::register"]},{"text":"impl UnwindSafe for login","synthetic":true,"types":["mcaptcha::api::v1::auth::login"]},{"text":"impl UnwindSafe for signout","synthetic":true,"types":["mcaptcha::api::v1::auth::signout"]},{"text":"impl UnwindSafe for MCaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha"]},{"text":"impl UnwindSafe for MCaptchaID","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID"]},{"text":"impl UnwindSafe for MCaptchaDetails","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails"]},{"text":"impl UnwindSafe for update_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::update_token"]},{"text":"impl UnwindSafe for get_token","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::get_token"]},{"text":"impl UnwindSafe for delete_mcaptcha","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha"]},{"text":"impl UnwindSafe for Duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::routes::Duration"]},{"text":"impl UnwindSafe for UpdateDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::UpdateDuration"]},{"text":"impl UnwindSafe for update_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::update_duration"]},{"text":"impl UnwindSafe for GetDurationResp","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDurationResp"]},{"text":"impl UnwindSafe for GetDuration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::GetDuration"]},{"text":"impl UnwindSafe for get_duration","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::duration::get_duration"]},{"text":"impl UnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::routes::Levels"]},{"text":"impl UnwindSafe for AddLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::AddLevels"]},{"text":"impl UnwindSafe for add_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::add_levels"]},{"text":"impl UnwindSafe for UpdateLevels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::UpdateLevels"]},{"text":"impl UnwindSafe for update_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::update_levels"]},{"text":"impl UnwindSafe for delete_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::delete_levels"]},{"text":"impl UnwindSafe for get_levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::get_levels"]},{"text":"impl UnwindSafe for Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::Levels"]},{"text":"impl UnwindSafe for I32Levels","synthetic":true,"types":["mcaptcha::api::v1::mcaptcha::levels::I32Levels"]},{"text":"impl UnwindSafe for Meta","synthetic":true,"types":["mcaptcha::api::v1::meta::routes::Meta"]},{"text":"impl UnwindSafe for BuildDetails","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetails"]},{"text":"impl UnwindSafe for BuildDetailsBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilder"]},{"text":"impl UnwindSafe for BuildDetailsBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::BuildDetailsBuilderError"]},{"text":"impl UnwindSafe for build_details","synthetic":true,"types":["mcaptcha::api::v1::meta::build_details"]},{"text":"impl UnwindSafe for Health","synthetic":true,"types":["mcaptcha::api::v1::meta::Health"]},{"text":"impl UnwindSafe for HealthBuilder","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilder"]},{"text":"impl UnwindSafe for HealthBuilderError","synthetic":true,"types":["mcaptcha::api::v1::meta::HealthBuilderError"]},{"text":"impl UnwindSafe for health","synthetic":true,"types":["mcaptcha::api::v1::meta::health"]},{"text":"impl UnwindSafe for AddNotification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::AddNotification"]},{"text":"impl UnwindSafe for add_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::add::add_notification"]},{"text":"impl UnwindSafe for Notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::Notification"]},{"text":"impl UnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::NotificationResp"]},{"text":"impl UnwindSafe for get_notification","synthetic":true,"types":["mcaptcha::api::v1::notifications::get::get_notification"]},{"text":"impl UnwindSafe for MarkReadReq","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::MarkReadReq"]},{"text":"impl UnwindSafe for NotificationResp","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::NotificationResp"]},{"text":"impl UnwindSafe for mark_read","synthetic":true,"types":["mcaptcha::api::v1::notifications::mark_read::mark_read"]},{"text":"impl UnwindSafe for Notifications","synthetic":true,"types":["mcaptcha::api::v1::notifications::routes::Notifications"]},{"text":"impl UnwindSafe for GetConfigPayload","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::GetConfigPayload"]},{"text":"impl UnwindSafe for get_config","synthetic":true,"types":["mcaptcha::api::v1::pow::get_config::get_config"]},{"text":"impl UnwindSafe for ValidationToken","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::ValidationToken"]},{"text":"impl UnwindSafe for verify_pow","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_pow::verify_pow"]},{"text":"impl UnwindSafe for CaptchaValidateResp","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp"]},{"text":"impl UnwindSafe for validate_captcha_token","synthetic":true,"types":["mcaptcha::api::v1::pow::verify_token::validate_captcha_token"]},{"text":"impl UnwindSafe for PoW","synthetic":true,"types":["mcaptcha::api::v1::pow::routes::PoW"]},{"text":"impl UnwindSafe for Routes","synthetic":true,"types":["mcaptcha::api::v1::routes::Routes"]},{"text":"impl !UnwindSafe for SystemGroup","synthetic":true,"types":["mcaptcha::data::SystemGroup"]},{"text":"impl !UnwindSafe for Data","synthetic":true,"types":["mcaptcha::data::Data"]},{"text":"impl UnwindSafe for Docs","synthetic":true,"types":["mcaptcha::docs::routes::Docs"]},{"text":"impl UnwindSafe for Asset","synthetic":true,"types":["mcaptcha::docs::Asset"]},{"text":"impl<'a> UnwindSafe for IndexPage<'a>","synthetic":true,"types":["mcaptcha::email::verification::IndexPage"]},{"text":"impl !UnwindSafe for SmtpErrorWrapper","synthetic":true,"types":["mcaptcha::errors::SmtpErrorWrapper"]},{"text":"impl !UnwindSafe for ServiceError","synthetic":true,"types":["mcaptcha::errors::ServiceError"]},{"text":"impl UnwindSafe for ErrorToResponse","synthetic":true,"types":["mcaptcha::errors::ErrorToResponse"]},{"text":"impl !UnwindSafe for PageError","synthetic":true,"types":["mcaptcha::errors::PageError"]},{"text":"impl UnwindSafe for CheckLogin","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLogin"]},{"text":"impl<S> UnwindSafe for CheckLoginMiddleware<S> where
    S: UnwindSafe
","synthetic":true,"types":["mcaptcha::middleware::auth::CheckLoginMiddleware"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::login::IndexPage"]},{"text":"impl UnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::login::INDEX"]},{"text":"impl UnwindSafe for login","synthetic":true,"types":["mcaptcha::pages::auth::login::login"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::auth::register::IndexPage"]},{"text":"impl UnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::auth::register::INDEX"]},{"text":"impl UnwindSafe for join","synthetic":true,"types":["mcaptcha::pages::auth::register::join"]},{"text":"impl UnwindSafe for Auth","synthetic":true,"types":["mcaptcha::pages::auth::routes::Auth"]},{"text":"impl UnwindSafe for Errors","synthetic":true,"types":["mcaptcha::pages::errors::routes::Errors"]},{"text":"impl<'a> UnwindSafe for ErrorPage<'a>","synthetic":true,"types":["mcaptcha::pages::errors::ErrorPage"]},{"text":"impl UnwindSafe for INTERNAL_SERVER_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY"]},{"text":"impl UnwindSafe for UNKNOWN_ERROR_BODY","synthetic":true,"types":["mcaptcha::pages::errors::UNKNOWN_ERROR_BODY"]},{"text":"impl UnwindSafe for INDEX","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::INDEX"]},{"text":"impl<'a> UnwindSafe for IndexPage<'a>","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::IndexPage"]},{"text":"impl UnwindSafe for add_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::add::add_sitekey"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::IndexPage"]},{"text":"impl UnwindSafe for list_sitekeys","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::list::list_sitekeys"]},{"text":"impl UnwindSafe for McaptchaConfig","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::McaptchaConfig"]},{"text":"impl UnwindSafe for Level","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::Level"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::IndexPage"]},{"text":"impl UnwindSafe for view_sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::view::view_sitekey"]},{"text":"impl UnwindSafe for Sitekey","synthetic":true,"types":["mcaptcha::pages::panel::sitekey::routes::Sitekey"]},{"text":"impl UnwindSafe for Panel","synthetic":true,"types":["mcaptcha::pages::panel::routes::Panel"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::pages::panel::IndexPage"]},{"text":"impl UnwindSafe for panel","synthetic":true,"types":["mcaptcha::pages::panel::panel"]},{"text":"impl UnwindSafe for Routes","synthetic":true,"types":["mcaptcha::pages::routes::Routes"]},{"text":"impl UnwindSafe for Methods","synthetic":true,"types":["mcaptcha::routes::Methods"]},{"text":"impl UnwindSafe for Server","synthetic":true,"types":["mcaptcha::settings::Server"]},{"text":"impl UnwindSafe for Captcha","synthetic":true,"types":["mcaptcha::settings::Captcha"]},{"text":"impl UnwindSafe for Smtp","synthetic":true,"types":["mcaptcha::settings::Smtp"]},{"text":"impl UnwindSafe for DatabaseBuilder","synthetic":true,"types":["mcaptcha::settings::DatabaseBuilder"]},{"text":"impl UnwindSafe for Database","synthetic":true,"types":["mcaptcha::settings::Database"]},{"text":"impl UnwindSafe for Redis","synthetic":true,"types":["mcaptcha::settings::Redis"]},{"text":"impl UnwindSafe for Settings","synthetic":true,"types":["mcaptcha::settings::Settings"]},{"text":"impl UnwindSafe for FileMap","synthetic":true,"types":["mcaptcha::static_assets::filemap::FileMap"]},{"text":"impl UnwindSafe for Asset","synthetic":true,"types":["mcaptcha::static_assets::static_files::Asset"]},{"text":"impl UnwindSafe for static_files","synthetic":true,"types":["mcaptcha::static_assets::static_files::static_files"]},{"text":"impl UnwindSafe for Favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::Favicons"]},{"text":"impl UnwindSafe for favicons","synthetic":true,"types":["mcaptcha::static_assets::static_files::favicons"]},{"text":"impl UnwindSafe for Stats","synthetic":true,"types":["mcaptcha::stats::fetch::Stats"]},{"text":"impl UnwindSafe for Widget","synthetic":true,"types":["mcaptcha::widget::routes::Widget"]},{"text":"impl UnwindSafe for IndexPage","synthetic":true,"types":["mcaptcha::widget::IndexPage"]},{"text":"impl UnwindSafe for INDEX_PAGE","synthetic":true,"types":["mcaptcha::widget::INDEX_PAGE"]},{"text":"impl UnwindSafe for show_widget","synthetic":true,"types":["mcaptcha::widget::show_widget"]},{"text":"impl UnwindSafe for WidgetAssets","synthetic":true,"types":["mcaptcha::widget::WidgetAssets"]},{"text":"impl UnwindSafe for widget_assets","synthetic":true,"types":["mcaptcha::widget::widget_assets"]},{"text":"impl UnwindSafe for SETTINGS","synthetic":true,"types":["mcaptcha::SETTINGS"]},{"text":"impl UnwindSafe for FILES","synthetic":true,"types":["mcaptcha::FILES"]},{"text":"impl UnwindSafe for JS","synthetic":true,"types":["mcaptcha::JS"]},{"text":"impl UnwindSafe for CSS","synthetic":true,"types":["mcaptcha::CSS"]},{"text":"impl UnwindSafe for MOBILE_CSS","synthetic":true,"types":["mcaptcha::MOBILE_CSS"]},{"text":"impl UnwindSafe for VERIFICATIN_WIDGET_JS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_JS"]},{"text":"impl UnwindSafe for VERIFICATIN_WIDGET_CSS","synthetic":true,"types":["mcaptcha::VERIFICATIN_WIDGET_CSS"]},{"text":"impl UnwindSafe for SOURCE_FILES_OF_INSTANCE","synthetic":true,"types":["mcaptcha::SOURCE_FILES_OF_INSTANCE"]}]; implementors["tests_migrate"] = [{"text":"impl !UnwindSafe for SystemGroup","synthetic":true,"types":["tests_migrate::data::SystemGroup"]},{"text":"impl !UnwindSafe for Data","synthetic":true,"types":["tests_migrate::data::Data"]},{"text":"impl UnwindSafe for Server","synthetic":true,"types":["tests_migrate::settings::Server"]},{"text":"impl UnwindSafe for Captcha","synthetic":true,"types":["tests_migrate::settings::Captcha"]},{"text":"impl UnwindSafe for Smtp","synthetic":true,"types":["tests_migrate::settings::Smtp"]},{"text":"impl UnwindSafe for DatabaseBuilder","synthetic":true,"types":["tests_migrate::settings::DatabaseBuilder"]},{"text":"impl UnwindSafe for Database","synthetic":true,"types":["tests_migrate::settings::Database"]},{"text":"impl UnwindSafe for Redis","synthetic":true,"types":["tests_migrate::settings::Redis"]},{"text":"impl UnwindSafe for Settings","synthetic":true,"types":["tests_migrate::settings::Settings"]},{"text":"impl UnwindSafe for SETTINGS","synthetic":true,"types":["tests_migrate::SETTINGS"]}]; if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/light.css b/light.css index fa73fe22..a5060b7b 100644 --- a/light.css +++ b/light.css @@ -1 +1 @@ - body{background-color:white;color:black;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:black;}h1.fqn{border-bottom-color:#D5D5D5;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#DDDDDD;}.in-band{background-color:white;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#F5F5F5;}pre{background-color:#F5F5F5;}.sidebar{background-color:#F1F1F1;}*{scrollbar-color:rgba(36,37,39,0.6) #e6e6e6;}.sidebar{scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;}.logo-container.rust-logo>img{}::-webkit-scrollbar-track{background-color:#ecebeb;}::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar::-webkit-scrollbar-track{background-color:#dcdcdc;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar .current{background-color:#fff;}.source .sidebar{background-color:#fff;}.sidebar .location{border-color:#000;background-color:#fff;color:#333;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#F5F5F5;}.line-numbers span{color:#c67e2d;}.line-numbers .line-highlighted{background-color:#f6fdb0 !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#ddd;}.docblock table,.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#4E4C4C;}.content .highlighted{color:#000 !important;background-color:#ccc;}.content .highlighted a,.content .highlighted span{color:#000 !important;}.content .highlighted.trait{background-color:#c7b6ff;}.content .highlighted.traitalias{background-color:#c7b6ff;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.enum{background-color:#b4d1b9;}.content .highlighted.struct{background-color:#e7b1a0;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#c6afb3;}.content .highlighted.type{background-color:#ffc891;}.content .highlighted.foreigntype{background-color:#f5c4ff;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#8ce488;}.content .highlighted.constant,.content .highlighted.static{background-color:#c3e0ff;}.content .highlighted.primitive{background-color:#9aecff;}.content .highlighted.keyword{background-color:#f99650;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#508157;}.content span.struct,.content a.struct,.block a.current.struct{color:#ad448e;}.content span.type,.content a.type,.block a.current.type{color:#ba5d00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#cd00e2;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#068000;}.content span.union,.content a.union,.block a.current.union{color:#767b27;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#546e8a;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#2c8093;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#4d76ae;}.content span.trait,.content a.trait,.block a.current.trait{color:#7c5af3;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#6841f1;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#9a6e31;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8E908C;}pre.rust .doccomment{color:#4D4D4C;}nav:not(.sidebar){border-bottom-color:#e0e0e0;}nav.main .current{border-top-color:#000;border-bottom-color:#000;}nav.main .separator{border:1px solid #000;}a{color:#000;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#3873AD;}a.test-arrow{color:#f5f5f5;}.collapse-toggle{color:#999;}#crate-search{color:#555;background-color:white;border-color:#e0e0e0;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input{color:#555;background-color:white;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input:focus{border-color:#66afe9;}.search-focus:disabled{background-color:#e6e6e6;}#crate-search+.search-input:focus{box-shadow:0 0 8px #078dd8;}.module-item .stab{color:#000;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;}.stab.deprecated{background:#F3DFFF;border-color:#7F0087;}.stab.portability{background:#C4ECFF;border-color:#7BA5DB;}.stab.portability>code{color:#000;}#help>div{background:#e9e9e9;border-color:#bfbfbf;}#help>div>span{border-bottom-color:#bfbfbf;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:black;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#8959A8;}pre.rust .kw-2,pre.rust .prelude-ty{color:#4271AE;}pre.rust .number,pre.rust .string{color:#718C00;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#C82829;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#B76514;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#c7c7c7;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label{color:#999;}:target>code,:target>.in-band{background:#FDFFD3;border-right:3px solid #ffb44c;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.5);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.5);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#eee;border-color:#999;}#titles>button:not(.selected){background-color:#e6e6e6;border-top-color:#e6e6e6;}#titles>button:hover,#titles>button.selected{background-color:#ffffff;border-top-color:#0089ff;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#F1F1F1;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#F1F1F1;border-right-color:#000;}#sidebar-filler{background-color:#F1F1F1;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,.help-button{border-color:#e0e0e0;background-color:#fff;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,.help-button:hover,.help-button:focus{border-color:#717171;}#theme-choices{border-color:#ccc;background-color:#fff;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#eee;}@media (max-width:700px){#theme-picker{background:#fff;}}#all-types{background-color:#fff;}#all-types:hover{background-color:#f9f9f9;}.search-results td span.alias{color:#000;}.search-results td span.grey{color:#999;}#sidebar-toggle{background-color:#F1F1F1;}#sidebar-toggle:hover{background-color:#E0E0E0;}#source-sidebar{background-color:#F1F1F1;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#E0E0E0;}div.files>.selected{background-color:#fff;}.setting-line>.title{border-bottom-color:#D5D5D5;} \ No newline at end of file + body{background-color:white;color:black;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){color:black;}h1.fqn{border-bottom-color:#D5D5D5;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod){border-bottom-color:#DDDDDD;}.in-band{background-color:white;}.invisible{background:rgba(0,0,0,0);}.docblock code,.docblock-short code{background-color:#F5F5F5;}pre{background-color:#F5F5F5;}.sidebar{background-color:#F1F1F1;}*{scrollbar-color:rgba(36,37,39,0.6) #e6e6e6;}.sidebar{scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;}.logo-container.rust-logo>img{}::-webkit-scrollbar-track{background-color:#ecebeb;}::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar::-webkit-scrollbar-track{background-color:#dcdcdc;}.sidebar::-webkit-scrollbar-thumb{background-color:rgba(36,37,39,0.6);}.sidebar .current{background-color:#fff;}.source .sidebar{background-color:#fff;}.sidebar .location{border-color:#000;background-color:#fff;color:#333;}.sidebar .version{border-bottom-color:#DDD;}.sidebar-title{border-top-color:#777;border-bottom-color:#777;}.block a:hover{background:#F5F5F5;}.line-numbers span{color:#c67e2d;}.line-numbers .line-highlighted{background-color:#f6fdb0 !important;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom-color:#ddd;}.docblock table,.docblock table td,.docblock table th{border-color:#ddd;}.content .method .where,.content .fn .where,.content .where.fmt-newline{color:#4E4C4C;}.content .highlighted{color:#000 !important;background-color:#ccc;}.content .highlighted a,.content .highlighted span{color:#000 !important;}.content .highlighted.trait{background-color:#c7b6ff;}.content .highlighted.traitalias{background-color:#c7b6ff;}.content .highlighted.mod,.content .highlighted.externcrate{background-color:#afc6e4;}.content .highlighted.enum{background-color:#b4d1b9;}.content .highlighted.struct{background-color:#e7b1a0;}.content .highlighted.union{background-color:#b7bd49;}.content .highlighted.fn,.content .highlighted.method,.content .highlighted.tymethod{background-color:#c6afb3;}.content .highlighted.type{background-color:#ffc891;}.content .highlighted.foreigntype{background-color:#f5c4ff;}.content .highlighted.attr,.content .highlighted.derive,.content .highlighted.macro{background-color:#8ce488;}.content .highlighted.constant,.content .highlighted.static{background-color:#c3e0ff;}.content .highlighted.primitive{background-color:#9aecff;}.content .highlighted.keyword{background-color:#f99650;}.content .item-info::before{color:#ccc;}.content span.enum,.content a.enum,.block a.current.enum{color:#508157;}.content span.struct,.content a.struct,.block a.current.struct{color:#ad448e;}.content span.type,.content a.type,.block a.current.type{color:#ba5d00;}.content span.foreigntype,.content a.foreigntype,.block a.current.foreigntype{color:#cd00e2;}.content span.attr,.content a.attr,.block a.current.attr,.content span.derive,.content a.derive,.block a.current.derive,.content span.macro,.content a.macro,.block a.current.macro{color:#068000;}.content span.union,.content a.union,.block a.current.union{color:#767b27;}.content span.constant,.content a.constant,.block a.current.constant,.content span.static,.content a.static,.block a.current.static{color:#546e8a;}.content span.primitive,.content a.primitive,.block a.current.primitive{color:#2c8093;}.content span.externcrate,.content span.mod,.content a.mod,.block a.current.mod{color:#4d76ae;}.content span.trait,.content a.trait,.block a.current.trait{color:#7c5af3;}.content span.traitalias,.content a.traitalias,.block a.current.traitalias{color:#6841f1;}.content span.fn,.content a.fn,.block a.current.fn,.content span.method,.content a.method,.block a.current.method,.content span.tymethod,.content a.tymethod,.block a.current.tymethod,.content .fnname{color:#9a6e31;}.content span.keyword,.content a.keyword,.block a.current.keyword{color:#de5249;}pre.rust .comment{color:#8E908C;}pre.rust .doccomment{color:#4D4D4C;}nav:not(.sidebar){border-bottom-color:#e0e0e0;}nav.main .current{border-top-color:#000;border-bottom-color:#000;}nav.main .separator{border:1px solid #000;}a{color:#000;}.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),.docblock-short a:not(.srclink):not(.test-arrow),.item-info a,#help a{color:#3873AD;}a.test-arrow{color:#f5f5f5;}.collapse-toggle,details.rustdoc-toggle>summary.hideme>span,details.rustdoc-toggle>summary::before{color:#999;}#crate-search{color:#555;background-color:white;border-color:#e0e0e0;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input{color:#555;background-color:white;box-shadow:0 0 0 1px #e0e0e0,0 0 0 2px transparent;}.search-input:focus{border-color:#66afe9;}.search-focus:disabled{background-color:#e6e6e6;}#crate-search+.search-input:focus{box-shadow:0 0 8px #078dd8;}.module-item .stab,.import-item .stab{color:#000;}.stab.unstable{background:#FFF5D6;border-color:#FFC600;}.stab.deprecated{background:#ffc4c4;border-color:#db7b7b;}.stab.portability{background:#F3DFFF;border-color:#b07bdb;}.stab.portability>code{background:none;}#help>div{background:#e9e9e9;border-color:#bfbfbf;}#help>div>span{border-bottom-color:#bfbfbf;}.since{color:grey;}tr.result span.primitive::after,tr.result span.keyword::after{color:black;}.line-numbers :target{background-color:transparent;}pre.rust .kw{color:#8959A8;}pre.rust .kw-2,pre.rust .prelude-ty{color:#4271AE;}pre.rust .number,pre.rust .string{color:#718C00;}pre.rust .self,pre.rust .bool-val,pre.rust .prelude-val,pre.rust .attribute,pre.rust .attribute .ident{color:#C82829;}pre.rust .macro,pre.rust .macro-nonterminal{color:#3E999F;}pre.rust .lifetime{color:#B76514;}pre.rust .question-mark{color:#ff9011;}.example-wrap>pre.line-number{border-color:#c7c7c7;}a.test-arrow{background-color:rgba(78,139,202,0.2);}a.test-arrow:hover{background-color:#4e8bca;}.toggle-label,.code-attribute{color:#999;}:target>code,:target>.in-band{background:#FDFFD3;border-right:3px solid #ffb44c;}pre.compile_fail{border-left:2px solid rgba(255,0,0,.5);}pre.compile_fail:hover,.information:hover+pre.compile_fail{border-left:2px solid #f00;}pre.should_panic{border-left:2px solid rgba(255,0,0,.5);}pre.should_panic:hover,.information:hover+pre.should_panic{border-left:2px solid #f00;}pre.ignore{border-left:2px solid rgba(255,142,0,.6);}pre.ignore:hover,.information:hover+pre.ignore{border-left:2px solid #ff9200;}.tooltip.compile_fail{color:rgba(255,0,0,.5);}.information>.compile_fail:hover{color:#f00;}.tooltip.should_panic{color:rgba(255,0,0,.5);}.information>.should_panic:hover{color:#f00;}.tooltip.ignore{color:rgba(255,142,0,.6);}.information>.ignore:hover{color:#ff9200;}.search-failed a{color:#0089ff;}.tooltip::after{background-color:#000;color:#fff;}.tooltip::before{border-color:transparent black transparent transparent;}.notable-traits-tooltiptext{background-color:#eee;border-color:#999;}#titles>button:not(.selected){background-color:#e6e6e6;border-top-color:#e6e6e6;}#titles>button:hover,#titles>button.selected{background-color:#ffffff;border-top-color:#0089ff;}#titles>button>div.count{color:#888;}@media (max-width:700px){.sidebar-menu{background-color:#F1F1F1;border-bottom-color:#e0e0e0;border-right-color:#e0e0e0;}.sidebar-elems{background-color:#F1F1F1;border-right-color:#000;}#sidebar-filler{background-color:#F1F1F1;border-bottom-color:#e0e0e0;}}kbd{color:#000;background-color:#fafbfc;border-color:#d1d5da;border-bottom-color:#c6cbd1;box-shadow-color:#c6cbd1;}#theme-picker,#settings-menu,.help-button,#copy-path{border-color:#e0e0e0;background-color:#fff;}#theme-picker:hover,#theme-picker:focus,#settings-menu:hover,#settings-menu:focus,.help-button:hover,.help-button:focus,#copy-path:hover,#copy-path:focus{border-color:#717171;}#theme-choices{border-color:#ccc;background-color:#fff;}#theme-choices>button:not(:first-child){border-top-color:#e0e0e0;}#theme-choices>button:hover,#theme-choices>button:focus{background-color:#eee;}@media (max-width:700px){#theme-picker{background:#fff;}}#all-types{background-color:#fff;}#all-types:hover{background-color:#f9f9f9;}.search-results td span.alias{color:#000;}.search-results td span.grey{color:#999;}#sidebar-toggle{background-color:#F1F1F1;}#sidebar-toggle:hover{background-color:#E0E0E0;}#source-sidebar{background-color:#F1F1F1;}#source-sidebar>.title{border-bottom-color:#ccc;}div.files>a:hover,div.name:hover{background-color:#E0E0E0;}div.files>.selected{background-color:#fff;}.setting-line>.title{border-bottom-color:#D5D5D5;} \ No newline at end of file diff --git a/main.js b/main.js index 7217fe8e..0639f070 100644 --- a/main.js +++ b/main.js @@ -1,8 +1,8 @@ -if(!String.prototype.startsWith){String.prototype.startsWith=function(searchString,position){position=position||0;return this.indexOf(searchString,position)===position}}if(!String.prototype.endsWith){String.prototype.endsWith=function(suffix,length){var l=length||this.length;return this.indexOf(suffix,l-suffix.length)!==-1}}if(!DOMTokenList.prototype.add){DOMTokenList.prototype.add=function(className){if(className&&!hasClass(this,className)){if(this.className&&this.className.length>0){this.className+=" "+className}else{this.className=className}}}}if(!DOMTokenList.prototype.remove){DOMTokenList.prototype.remove=function(className){if(className&&this.className){this.className=(" "+this.className+" ").replace(" "+className+" "," ").trim()}}}(function(){var rustdocVars=document.getElementById("rustdoc-vars");if(rustdocVars){window.rootPath=rustdocVars.attributes["data-root-path"].value;window.currentCrate=rustdocVars.attributes["data-current-crate"].value}var sidebarVars=document.getElementById("sidebar-vars");if(sidebarVars){window.sidebarCurrent={name:sidebarVars.attributes["data-name"].value,ty:sidebarVars.attributes["data-ty"].value,relpath:sidebarVars.attributes["data-relpath"].value,}}}());function getVirtualKey(ev){if("key"in ev&&typeof ev.key!="undefined"){return ev.key}var c=ev.charCode||ev.keyCode;if(c==27){return"Escape"}return String.fromCharCode(c)}function getSearchInput(){return document.getElementsByClassName("search-input")[0]}function getSearchElement(){return document.getElementById("search")}function getThemesElement(){return document.getElementById("theme-choices")}function getThemePickerElement(){return document.getElementById("theme-picker")}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function focusSearchBar(){getSearchInput().focus()}function defocusSearchBar(){getSearchInput().blur()}(function(){"use strict";var itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive","traitalias"];var disableShortcuts=getSettingValue("disable-shortcuts")==="true";var search_input=getSearchInput();var searchTimeout=null;var toggleAllDocsId="toggle-all-docs";var currentTab=0;var mouseMovedAfterSearch=true;var titleBeforeSearch=document.title;var searchTitle=null;function clearInputTimeout(){if(searchTimeout!==null){clearTimeout(searchTimeout);searchTimeout=null}}function getPageId(){if(window.location.hash){var tmp=window.location.hash.replace(/^#/,"");if(tmp.length>0){return tmp}}return null}function showSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){addClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];if(sidebar){addClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(!filler){var div=document.createElement("div");div.id="sidebar-filler";sidebar.appendChild(div)}}}function hideSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){removeClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(filler){filler.remove()}document.getElementsByTagName("body")[0].style.marginTop=""}function showSearchResults(search){if(search===null||typeof search==='undefined'){search=getSearchElement()}addClass(main,"hidden");removeClass(search,"hidden");mouseMovedAfterSearch=false;document.title=searchTitle}function hideSearchResults(search){if(search===null||typeof search==='undefined'){search=getSearchElement()}addClass(search,"hidden");removeClass(main,"hidden");document.title=titleBeforeSearch}var TY_PRIMITIVE=itemTypes.indexOf("primitive");var TY_KEYWORD=itemTypes.indexOf("keyword");function getQueryStringParams(){var params={};window.location.search.substring(1).split("&").map(function(s){var pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function"}function isHidden(elem){return elem.offsetHeight===0}var main=document.getElementById("main");var savedHash="";function handleHashes(ev){var elem;var search=getSearchElement();if(ev!==null&&search&&!hasClass(search,"hidden")&&ev.newURL){hideSearchResults(search);var hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(hash,"",getNakedUrl()+window.location.search+"#"+hash)}elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}if(savedHash!==window.location.hash){savedHash=window.location.hash;if(savedHash.length===0){return}elem=document.getElementById(savedHash.slice(1));if(!elem||!isHidden(elem)){return}var parent=elem.parentNode;if(parent&&hasClass(parent,"impl-items")){onEachLazy(parent.getElementsByClassName("collapsed"),function(e){if(e.parentNode===parent){e.click();return true}});if(isHidden(elem)){if(hasClass(parent.lastElementChild,"collapse-toggle")){parent.lastElementChild.click()}}}}}function highlightSourceLines(match,ev){if(typeof match==="undefined"){hideSidebar();match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/)}if(!match){return}var from=parseInt(match[1],10);var to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(to0){collapseDocs(collapses[0],"show")}}}}function getHelpElement(){buildHelperPopup();return document.getElementById("help")}function displayHelp(display,ev,help){help=help?help:getHelpElement();if(display===true){if(hasClass(help,"hidden")){ev.preventDefault();removeClass(help,"hidden");addClass(document.body,"blur")}}else if(hasClass(help,"hidden")===false){ev.preventDefault();addClass(help,"hidden");removeClass(document.body,"blur")}}function handleEscape(ev){var help=getHelpElement();var search=getSearchElement();if(hasClass(help,"hidden")===false){displayHelp(false,ev,help)}else if(hasClass(search,"hidden")===false){clearInputTimeout();ev.preventDefault();hideSearchResults(search)}defocusSearchBar();hideThemeButtonState()}function handleShortcut(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts===true){return}if(document.activeElement.tagName==="INPUT"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":displayHelp(false,ev);ev.preventDefault();focusSearchBar();break;case"+":case"-":ev.preventDefault();toggleAllDocs();break;case"?":displayHelp(true,ev);break;case"t":case"T":displayHelp(false,ev);ev.preventDefault();var themePicker=getThemePickerElement();themePicker.click();themePicker.focus();break;default:var themePicker=getThemePickerElement();if(themePicker.parentNode.contains(ev.target)){handleThemeKeyDown(ev)}}}}function handleThemeKeyDown(ev){var active=document.activeElement;var themes=getThemesElement();switch(getVirtualKey(ev)){case"ArrowUp":ev.preventDefault();if(active.previousElementSibling&&ev.target.id!=="theme-picker"){active.previousElementSibling.focus()}else{showThemeButtonState();themes.lastElementChild.focus()}break;case"ArrowDown":ev.preventDefault();if(active.nextElementSibling&&ev.target.id!=="theme-picker"){active.nextElementSibling.focus()}else{showThemeButtonState();themes.firstElementChild.focus()}break;case"Enter":case"Return":case"Space":if(ev.target.id==="theme-picker"&&themes.style.display==="none"){ev.preventDefault();showThemeButtonState();themes.firstElementChild.focus()}break;case"Home":ev.preventDefault();themes.firstElementChild.focus();break;case"End":ev.preventDefault();themes.lastElementChild.focus();break}}function findParentElement(elem,tagName){do{if(elem&&elem.tagName===tagName){return elem}elem=elem.parentNode}while(elem);return null}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);document.addEventListener("mousemove",function(){mouseMovedAfterSearch=true});var handleSourceHighlight=(function(){var prev_line_id=0;var set_fragment=function(name){var x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);highlightSourceLines()}else{location.replace("#"+name)}window.scrollTo(x,y)};return function(ev){var cur_line_id=parseInt(ev.target.id,10);ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){var tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());document.addEventListener("click",function(ev){if(hasClass(ev.target,"help-button")){displayHelp(true,ev)}else if(hasClass(ev.target,"collapse-toggle")){collapseDocs(ev.target,"toggle")}else if(hasClass(ev.target.parentNode,"collapse-toggle")){collapseDocs(ev.target.parentNode,"toggle")}else if(ev.target.tagName==="SPAN"&&hasClass(ev.target.parentNode,"line-numbers")){handleSourceHighlight(ev)}else if(hasClass(getHelpElement(),"hidden")===false){var help=getHelpElement();var is_inside_help_popup=ev.target!==help&&help.contains(ev.target);if(is_inside_help_popup===false){addClass(help,"hidden");removeClass(document.body,"blur")}}else{var a=findParentElement(ev.target,"A");if(a&&a.hash){expandSection(a.hash.replace(/^#/,""))}}});(function(){var x=document.getElementsByClassName("version-selector");if(x.length>0){x[0].onchange=function(){var i,match,url=document.location.href,stripped="",len=window.rootPath.match(/\.\.\//g).length+1;for(i=0;i-1){var obj=searchIndex[results[i].id];obj.lev=results[i].lev;if(isType!==true||obj.type){var res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}}return out}function sortResults(results,isType){var ar=[];for(var entry in results){if(hasOwnProperty(results,entry)){ar.push(results[entry])}}results=ar;var i,len,result;for(i=0,len=results.length;ib?+1:-1)}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1}a=(aaa.item.desc==="");b=(bbb.item.desc==="");if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});for(i=0,len=results.length;i"));return{name:val.substring(0,val.indexOf("<")),generics:values.split(/\s*,\s*/),}}return{name:val,generics:[],}}function getObjectFromId(id){if(typeof id==="number"){return searchIndex[id]}return{'name':id}}function checkGenerics(obj,val){var lev_distance=MAX_LEV_DISTANCE+1;if(val.generics.length>0){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=obj[GENERICS_DATA].slice(0);var total=0;var done=0;var vlength=val.generics.length;for(var y=0;yGENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=obj[GENERICS_DATA].slice(0);var allFound=true;len=val.generics.length;for(y=0;allFound===true&&yGENERICS_DATA&&obj[GENERICS_DATA].length!==0){var tmp_lev=checkGenerics(obj,val);if(tmp_lev<=MAX_LEV_DISTANCE){return tmp_lev}}else{return 0}}if(literalSearch===true){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){return obj[GENERICS_DATA].some(function(name){return name===val.name})}return false}lev_distance=Math.min(levenshtein(obj[NAME],val.name),lev_distance);if(lev_distance<=MAX_LEV_DISTANCE){lev_distance=Math.ceil((checkGenerics(obj,val)+lev_distance)/2)}else if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){var olength=obj[GENERICS_DATA].length;for(x=0;x0){var length=obj.type[INPUTS_DATA].length;for(var i=0;iOUTPUT_DATA){var ret=obj.type[OUTPUT_DATA];if(typeof ret[0]==="string"){ret=[ret]}for(var x=0,len=ret.length;xlength){return MAX_LEV_DISTANCE+1}for(var i=0;ilength){break}var lev_total=0;var aborted=false;for(var x=0;xMAX_LEV_DISTANCE){aborted=true;break}lev_total+=lev}if(aborted===false){ret_lev=Math.min(ret_lev,Math.round(lev_total/clength))}}return ret_lev}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER)return true;if(filter===type)return true;var name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function generateId(ty){if(ty.parent&&ty.parent.name){return itemTypes[ty.ty]+ty.path+ty.parent.name+ty.name}return itemTypes[ty.ty]+ty.path+ty.name}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,desc:item.desc,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,}}function handleAliases(ret,query,filterCrates){var aliases=[];var crateAliases=[];if(filterCrates!==undefined){if(ALIASES[filterCrates]&&ALIASES[filterCrates][query.search]){var query_aliases=ALIASES[filterCrates][query.search];var len=query_aliases.length;for(var i=0;iMAX_RESULTS){ret.others.pop()}};onEach(aliases,pushFunc);onEach(crateAliases,pushFunc)}var nSearchWords=searchWords.length;var i,it;var ty;var fullId;var returned;var in_args;var len;if((val.charAt(0)==="\""||val.charAt(0)==="'")&&val.charAt(val.length-1)===val.charAt(0)){val=extractGenerics(val.substr(1,val.length-2));for(i=0;i")>-1){var trimmer=function(s){return s.trim()};var parts=val.split("->").map(trimmer);var input=parts[0];var inputs=input.split(",").map(trimmer).sort();for(i=0,len=inputs.length;i1?paths.length-1:1);var lev;for(j=0;j1){lev=checkPath(contains,paths[paths.length-1],ty);if(lev>MAX_LEV_DISTANCE){continue}else if(lev>0){lev_add=lev/10}}returned=MAX_LEV_DISTANCE+1;in_args=MAX_LEV_DISTANCE+1;var index=-1;lev=MAX_LEV_DISTANCE+1;fullId=generateId(ty);if(searchWords[j].indexOf(split[i])>-1||searchWords[j].indexOf(val)>-1||searchWords[j].replace(/_/g,"").indexOf(val)>-1){if(typePassesFilter(typeFilter,ty.ty)&&results[fullId]===undefined){index=searchWords[j].replace(/_/g,"").indexOf(val)}}if((lev=levenshtein(searchWords[j],val))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){lev=MAX_LEV_DISTANCE+1}else{lev+=1}}in_args=findArg(ty,valGenerics,false,typeFilter);returned=checkReturned(ty,valGenerics,false,typeFilter);lev+=lev_add;if(lev>0&&val.length>3&&searchWords[j].indexOf(val)>-1){if(val.length<6){lev-=1}else{lev=0}}if(in_args<=MAX_LEV_DISTANCE){if(results_in_args[fullId]===undefined){results_in_args[fullId]={id:j,index:index,lev:in_args,}}results_in_args[fullId].lev=Math.min(results_in_args[fullId].lev,in_args)}if(returned<=MAX_LEV_DISTANCE){if(results_returned[fullId]===undefined){results_returned[fullId]={id:j,index:index,lev:returned,}}results_returned[fullId].lev=Math.min(results_returned[fullId].lev,returned)}if(index!==-1||lev<=MAX_LEV_DISTANCE){if(index!==-1&&paths.length<2){lev=0}if(results[fullId]===undefined){results[fullId]={id:j,index:index,lev:lev,}}results[fullId].lev=Math.min(results[fullId].lev,lev)}}}var ret={"in_args":sortResults(results_in_args,true),"returned":sortResults(results_returned,true),"others":sortResults(results),};handleAliases(ret,query,filterCrates);return ret}function validateResult(name,path,keys,parent){for(var i=0,len=keys.length;i-1||path.indexOf(keys[i])>-1||(parent!==undefined&&parent.name!==undefined&&parent.name.toLowerCase().indexOf(keys[i])>-1)||levenshtein(name,keys[i])<=MAX_LEV_DISTANCE)){return false}}return true}function getQuery(raw){var matches,type,query;query=raw;matches=query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i);if(matches){type=matches[1].replace(/^const$/,"constant");query=query.substring(matches[0].length)}return{raw:raw,query:query,type:type,id:query+type}}function initSearchNav(){var hoverTimeout;var click_func=function(e){var el=e.target;while(el.tagName!=="TR"){el=el.parentNode}var dst=e.target.getElementsByTagName("a");if(dst.length<1){return}dst=dst[0];if(window.location.pathname===dst.pathname){hideSearchResults();document.location.href=dst.href}};var mouseover_func=function(e){if(mouseMovedAfterSearch){var el=e.target;while(el.tagName!=="TR"){el=el.parentNode}clearTimeout(hoverTimeout);hoverTimeout=setTimeout(function(){onEachLazy(document.getElementsByClassName("search-results"),function(e){onEachLazy(e.getElementsByClassName("result"),function(i_e){removeClass(i_e,"highlighted")})});addClass(el,"highlighted")},20)}};onEachLazy(document.getElementsByClassName("search-results"),function(e){onEachLazy(e.getElementsByClassName("result"),function(i_e){i_e.onclick=click_func;i_e.onmouseover=mouseover_func})});search_input.onkeydown=function(e){var actives=[[],[],[]];var current=0;onEachLazy(document.getElementById("results").childNodes,function(e){onEachLazy(e.getElementsByClassName("highlighted"),function(h_e){actives[current].push(h_e)});current+=1});if(e.which===38){if(e.ctrlKey){printTab(currentTab>0?currentTab-1:2)}else{if(!actives[currentTab].length||!actives[currentTab][0].previousElementSibling){return}addClass(actives[currentTab][0].previousElementSibling,"highlighted");removeClass(actives[currentTab][0],"highlighted")}e.preventDefault()}else if(e.which===40){if(e.ctrlKey){printTab(currentTab>1?0:currentTab+1)}else if(!actives[currentTab].length){var results=document.getElementById("results").childNodes;if(results.length>0){var res=results[currentTab].getElementsByClassName("result");if(res.length>0){addClass(res[0],"highlighted")}}}else if(actives[currentTab][0].nextElementSibling){addClass(actives[currentTab][0].nextElementSibling,"highlighted");removeClass(actives[currentTab][0],"highlighted")}e.preventDefault()}else if(e.which===13){if(actives[currentTab].length){document.location.href=actives[currentTab][0].getElementsByTagName("a")[0].href}}else if(e.which===16){}else if(actives[currentTab].length>0){removeClass(actives[currentTab][0],"highlighted")}}}function buildHrefAndPath(item){var displayPath;var href;var type=itemTypes[item.ty];var name=item.name;var path=item.path;if(type==="mod"){displayPath=path+"::";href=window.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="primitive"||type==="keyword"){displayPath="";href=window.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=window.rootPath+name+"/index.html"}else if(item.parent!==undefined){var myparent=item.parent;var anchor="#"+type+"."+name;var parentType=itemTypes[myparent.ty];var pageType=parentType;var pageName=myparent.name;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){var splitPath=item.path.split("::");var enumName=splitPath.pop();path=splitPath.join("::");displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="#variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}href=window.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html"+anchor}else{displayPath=item.path+"::";href=window.rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href]}function escape(content){var h1=document.createElement("h1");h1.textContent=content;return h1.innerHTML}function pathSplitter(path){var tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}function addTab(array,query,display){var extraStyle="";if(display===false){extraStyle=" style=\"display: none;\""}var output="";var duplicates={};var length=0;if(array.length>0){output="";array.forEach(function(item){var name,type;name=item.name;type=itemTypes[item.ty];if(item.is_alias!==true){if(duplicates[item.fullPath]){return}duplicates[item.fullPath]=true}length+=1;output+=""});output+="
"+""+(item.is_alias===true?(""+item.alias+"  - see "):"")+item.displayPath+""+name+""+""+""+item.desc+" 
"}else{output="

No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:
"}return[output,length]}function makeTabHeader(tabNb,text,nbElems){if(currentTab===tabNb){return""}return""}function showResults(results){var search=getSearchElement();if(results.others.length===1&&getSettingValue("go-to-only-result")==="true"&&(!search.firstChild||search.firstChild.innerText!==getSearchLoadingText())){var elem=document.createElement("a");elem.href=results.others[0].href;elem.style.display="none";document.body.appendChild(elem);elem.click();return}var query=getQuery(search_input.value);currentResults=query.id;var ret_others=addTab(results.others,query);var ret_in_args=addTab(results.in_args,query,false);var ret_returned=addTab(results.returned,query,false);if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}var output="

Results for "+escape(query.query)+(query.type?" (type: "+escape(query.type)+")":"")+"

"+"
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"+ret_others[0]+ret_in_args[0]+ret_returned[0]+"
";search.innerHTML=output;showSearchResults(search);initSearchNav();var elems=document.getElementById("titles").childNodes;elems[0].onclick=function(){printTab(0)};elems[1].onclick=function(){printTab(1)};elems[2].onclick=function(){printTab(2)};printTab(currentTab)}function execSearch(query,searchWords,filterCrates){function getSmallest(arrays,positions,notDuplicates){var start=null;for(var it=0,len=positions.length;itpositions[it]&&(start===null||start>arrays[it][positions[it]].lev)&&!notDuplicates[arrays[it][positions[it]].fullPath]){start=arrays[it][positions[it]].lev}}return start}function mergeArrays(arrays){var ret=[];var positions=[];var notDuplicates={};for(var x=0,arrays_len=arrays.length;xpositions[x]&&arrays[x][positions[x]].lev===smallest&&!notDuplicates[arrays[x][positions[x]].fullPath]){ret.push(arrays[x][positions[x]]);notDuplicates[arrays[x][positions[x]].fullPath]=true;positions[x]+=1}}}return ret}var queries=query.raw.split(",");var results={"in_args":[],"returned":[],"others":[],};for(var i=0,len=queries.length;i1){return{"in_args":mergeArrays(results.in_args),"returned":mergeArrays(results.returned),"others":mergeArrays(results.others),}}return{"in_args":results.in_args[0],"returned":results.returned[0],"others":results.others[0],}}function getFilterCrates(){var elem=document.getElementById("crate-search");if(elem&&elem.value!=="All crates"&&hasOwnProperty(rawSearchIndex,elem.value)){return elem.value}return undefined}function search(e,forced){var params=getQueryStringParams();var query=getQuery(search_input.value.trim());if(e){e.preventDefault()}if(query.query.length===0){return}if(forced!==true&&query.id===currentResults){if(query.query.length>0){putBackSearch(search_input)}return}searchTitle="Results for "+query.query+" - Rust";if(browserSupportsHistoryApi()){var newURL=getNakedUrl()+"?search="+encodeURIComponent(query.raw)+window.location.hash;if(!history.state&&!params.search){history.pushState(query,"",newURL)}else{history.replaceState(query,"",newURL)}}var filterCrates=getFilterCrates();showResults(execSearch(query,index,filterCrates))}function buildIndex(rawSearchIndex){searchIndex=[];var searchWords=[];var i;var currentIndex=0;for(var crate in rawSearchIndex){if(!hasOwnProperty(rawSearchIndex,crate)){continue}var crateSize=0;searchWords.push(crate);searchIndex.push({crate:crate,ty:1,name:crate,path:"",desc:rawSearchIndex[crate].doc,type:null,});currentIndex+=1;var items=rawSearchIndex[crate].i;var paths=rawSearchIndex[crate].p;var aliases=rawSearchIndex[crate].a;var len=paths.length;for(i=0;i0){search_input.value=params.search;search(e)}else{search_input.value="";hideSearchResults()}})}search()}index=buildIndex(rawSearchIndex);startSearch();if(window.rootPath==="../"||window.rootPath==="./"){var sidebar=document.getElementsByClassName("sidebar-elems")[0];if(sidebar){var div=document.createElement("div");div.className="block crate";div.innerHTML="

Crates

";var ul=document.createElement("ul");div.appendChild(ul);var crates=[];for(var crate in rawSearchIndex){if(!hasOwnProperty(rawSearchIndex,crate)){continue}crates.push(crate)}crates.sort();for(var i=0;i','`').replace('','`');return x.innerText}window.initSidebarItems=function(items){var sidebar=document.getElementsByClassName("sidebar-elems")[0];var current=window.sidebarCurrent;function block(shortty,longty){var filtered=items[shortty];if(!filtered){return}var div=document.createElement("div");div.className="block "+shortty;var h3=document.createElement("h3");h3.textContent=longty;div.appendChild(h3);var ul=document.createElement("ul");for(var i=0,len=filtered.length;i"+""+"
"+code.outerHTML+"
";list.appendChild(display)}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors)}function labelForToggleButton(sectionIsCollapsed){if(sectionIsCollapsed){return"+"}return"\u2212"}function onEveryMatchingChild(elem,className,func){if(elem&&className&&func){var length=elem.childNodes.length;var nodes=elem.childNodes;for(var i=0;i"+labelForToggleButton(sectionIsCollapsed)+"]";return toggle}function createToggle(toggle,otherMessage,fontSize,extraClass,show){var span=document.createElement("span");span.className="toggle-label";if(show){span.style.display="none"}if(!otherMessage){span.innerHTML=" Expand description"}else{span.innerHTML=otherMessage}if(fontSize){span.style.fontSize=fontSize}var mainToggle=toggle.cloneNode(true);mainToggle.appendChild(span);var wrapper=document.createElement("div");wrapper.className="toggle-wrapper";if(!show){addClass(wrapper,"collapsed");var inner=mainToggle.getElementsByClassName("inner");if(inner&&inner.length>0){inner[0].innerHTML="+"}}if(extraClass){addClass(wrapper,extraClass)}wrapper.appendChild(mainToggle);return wrapper}(function(){var toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs}var toggle=createSimpleToggle(false);var hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";var hideImplementors=getSettingValue("auto-collapse-implementors")!=="false";var func=function(e){var next=e.nextElementSibling;if(next&&hasClass(next,"item-info")){next=next.nextElementSibling}if(!next){return}if(hasClass(next,"docblock")){var newToggle=toggle.cloneNode(true);insertAfter(newToggle,e.childNodes[e.childNodes.length-1]);if(hideMethodDocs===true&&hasClass(e,"method")===true){collapseDocs(newToggle,"hide")}}};var funcImpl=function(e){var next=e.nextElementSibling;if(next&&hasClass(next,"item-info")){next=next.nextElementSibling}if(next&&hasClass(next,"docblock")){next=next.nextElementSibling}if(!next){return}if(hasClass(e,"impl")&&(next.getElementsByClassName("method").length>0||next.getElementsByClassName("associatedconstant").length>0)){var newToggle=toggle.cloneNode(true);insertAfter(newToggle,e.childNodes[e.childNodes.length-1]);if(hideImplementors===true&&e.parentNode.id==="implementors-list"){collapseDocs(newToggle,"hide")}}};onEachLazy(document.getElementsByClassName("method"),func);onEachLazy(document.getElementsByClassName("associatedconstant"),func);onEachLazy(document.getElementsByClassName("impl"),funcImpl);var impl_call=function(){};if(hideMethodDocs===true){impl_call=function(e,newToggle){if(e.id.match(/^impl(?:-\d+)?$/)===null){if(hasClass(e,"impl")===true){collapseDocs(newToggle,"hide")}}}}var newToggle=document.createElement("a");newToggle.href="javascript:void(0)";newToggle.className="collapse-toggle hidden-default collapsed";newToggle.innerHTML="["+labelForToggleButton(true)+"] Show hidden undocumented items";function toggleClicked(){if(hasClass(this,"collapsed")){removeClass(this,"collapsed");onEachLazy(this.parentNode.getElementsByClassName("hidden"),function(x){if(hasClass(x,"content")===false){removeClass(x,"hidden");addClass(x,"x")}},true);this.innerHTML="["+labelForToggleButton(false)+"] Hide undocumented items"}else{addClass(this,"collapsed");onEachLazy(this.parentNode.getElementsByClassName("x"),function(x){if(hasClass(x,"content")===false){addClass(x,"hidden");removeClass(x,"x")}},true);this.innerHTML="["+labelForToggleButton(true)+"] Show hidden undocumented items"}}onEachLazy(document.getElementsByClassName("impl-items"),function(e){onEachLazy(e.getElementsByClassName("associatedconstant"),func);var hiddenElems=Array.prototype.slice.call(e.getElementsByClassName("hidden"));var needToggle=hiddenElems.some(function(hiddenElem){return hasClass(hiddenElem,"content")===false&&hasClass(hiddenElem,"docblock")===false});if(needToggle===true){var inner_toggle=newToggle.cloneNode(true);inner_toggle.onclick=toggleClicked;e.insertBefore(inner_toggle,e.firstChild);impl_call(e.previousSibling,inner_toggle)}});var currentType=document.getElementsByClassName("type-decl")[0];var className=null;if(currentType){currentType=currentType.getElementsByClassName("rust")[0];if(currentType){currentType.classList.forEach(function(item){if(item!=="main"){className=item;return true}})}}var showItemDeclarations=getSettingValue("auto-hide-"+className);if(showItemDeclarations===null){if(className==="enum"||className==="macro"){showItemDeclarations="false"}else if(className==="struct"||className==="union"||className==="trait"){showItemDeclarations="true"}else{showItemDeclarations=getSettingValue("auto-hide-declarations")}}showItemDeclarations=showItemDeclarations==="false";function buildToggleWrapper(e){if(hasClass(e,"autohide")){var wrap=e.previousElementSibling;if(wrap&&hasClass(wrap,"toggle-wrapper")){var inner_toggle=wrap.childNodes[0];var extra=e.childNodes[0].tagName==="H3";e.style.display="none";addClass(wrap,"collapsed");onEachLazy(inner_toggle.getElementsByClassName("inner"),function(e){e.innerHTML=labelForToggleButton(true)});onEachLazy(inner_toggle.getElementsByClassName("toggle-label"),function(e){e.style.display="inline-block";if(extra===true){e.innerHTML=" Show "+e.childNodes[0].innerHTML}})}}if(e.parentNode.id==="main"){var otherMessage="";var fontSize;var extraClass;if(hasClass(e,"type-decl")){fontSize="20px";otherMessage=" Show declaration";if(showItemDeclarations===false){extraClass="collapsed"}}else if(hasClass(e,"sub-variant")){otherMessage=" Show fields"}else if(hasClass(e,"non-exhaustive")){otherMessage=" This ";if(hasClass(e,"non-exhaustive-struct")){otherMessage+="struct"}else if(hasClass(e,"non-exhaustive-enum")){otherMessage+="enum"}else if(hasClass(e,"non-exhaustive-variant")){otherMessage+="enum variant"}else if(hasClass(e,"non-exhaustive-type")){otherMessage+="type"}otherMessage+=" is marked as non-exhaustive"}else if(hasClass(e.childNodes[0],"impl-items")){extraClass="marg-left"}e.parentNode.insertBefore(createToggle(toggle,otherMessage,fontSize,extraClass,hasClass(e,"type-decl")===false||showItemDeclarations===true),e);if(hasClass(e,"type-decl")===true&&showItemDeclarations===true){collapseDocs(e.previousSibling.childNodes[0],"toggle")}if(hasClass(e,"non-exhaustive")===true){collapseDocs(e.previousSibling.childNodes[0],"toggle")}}}onEachLazy(document.getElementsByClassName("docblock"),buildToggleWrapper);onEachLazy(document.getElementsByClassName("sub-variant"),buildToggleWrapper);autoCollapse(getSettingValue("collapse")==="true");var pageId=getPageId();if(pageId!==null){expandSection(pageId)}}());function createToggleWrapper(tog){var span=document.createElement("span");span.className="toggle-label";span.style.display="none";span.innerHTML=" Expand attributes";tog.appendChild(span);var wrapper=document.createElement("div");wrapper.className="toggle-wrapper toggle-attributes";wrapper.appendChild(tog);return wrapper}(function(){var itemAttributesFunc=function(){};if(getSettingValue("auto-hide-attributes")!=="false"){itemAttributesFunc=function(x){collapseDocs(x.previousSibling.childNodes[0],"toggle")}}var attributesToggle=createToggleWrapper(createSimpleToggle(false));onEachLazy(main.getElementsByClassName("attributes"),function(i_e){var attr_tog=attributesToggle.cloneNode(true);if(hasClass(i_e,"top-attr")===true){addClass(attr_tog,"top-attr")}i_e.parentNode.insertBefore(attr_tog,i_e);itemAttributesFunc(i_e)})}());(function(){var lineNumbersFunc=function(){};if(getSettingValue("line-numbers")==="true"){lineNumbersFunc=function(x){var count=x.textContent.split("\n").length;var elems=[];for(var i=0;i"+getSearchLoadingText()+"";showSearchResults(search)}var sidebar_menu=document.getElementsByClassName("sidebar-menu")[0];if(sidebar_menu){sidebar_menu.onclick=function(){var sidebar=document.getElementsByClassName("sidebar")[0];if(hasClass(sidebar,"mobile")===true){hideSidebar()}else{showSidebar()}}}if(main){onEachLazy(main.getElementsByClassName("loading-content"),function(e){e.remove()});onEachLazy(main.childNodes,function(e){if(e.tagName==="H2"||e.tagName==="H3"){var nextTagName=e.nextElementSibling.tagName;if(nextTagName=="H2"||nextTagName=="H3"){e.nextElementSibling.style.display="flex"}else{e.nextElementSibling.style.display="block"}}})}function enableSearchInput(){if(search_input){search_input.removeAttribute('disabled')}}window.addSearchOptions=function(crates){var elem=document.getElementById("crate-search");if(!elem){enableSearchInput();return}var crates_text=[];if(Object.keys(crates).length>1){for(var crate in crates){if(hasOwnProperty(crates,crate)){crates_text.push(crate)}}}crates_text.sort(function(a,b){var lower_a=a.toLowerCase();var lower_b=b.toLowerCase();if(lower_alower_b){return 1}return 0});var savedCrate=getSettingValue("saved-filter-crate");for(var i=0,len=crates_text.length;ithe rustdoc book.";var container=document.createElement("div");var shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["T","Focus the theme picker menu"],["↑","Move up in search results"],["↓","Move down in search results"],["ctrl + ↑ / ↓","Switch result tab"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(x=>"
"+x[0].split(" ").map((y,index)=>(index&1)===0?""+y+"":" "+y+" ").join("")+"
"+x[1]+"
").join("");var div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";var infos=["Prefix searches with a type followed by a colon (e.g., fn:) to \ +if(!String.prototype.startsWith){String.prototype.startsWith=function(searchString,position){position=position||0;return this.indexOf(searchString,position)===position}}if(!String.prototype.endsWith){String.prototype.endsWith=function(suffix,length){var l=length||this.length;return this.indexOf(suffix,l-suffix.length)!==-1}}if(!DOMTokenList.prototype.add){DOMTokenList.prototype.add=function(className){if(className&&!hasClass(this,className)){if(this.className&&this.className.length>0){this.className+=" "+className}else{this.className=className}}}}if(!DOMTokenList.prototype.remove){DOMTokenList.prototype.remove=function(className){if(className&&this.className){this.className=(" "+this.className+" ").replace(" "+className+" "," ").trim()}}}(function(){var rustdocVars=document.getElementById("rustdoc-vars");if(rustdocVars){window.rootPath=rustdocVars.attributes["data-root-path"].value;window.currentCrate=rustdocVars.attributes["data-current-crate"].value;window.searchJS=rustdocVars.attributes["data-search-js"].value;window.searchIndexJS=rustdocVars.attributes["data-search-index-js"].value}var sidebarVars=document.getElementById("sidebar-vars");if(sidebarVars){window.sidebarCurrent={name:sidebarVars.attributes["data-name"].value,ty:sidebarVars.attributes["data-ty"].value,relpath:sidebarVars.attributes["data-relpath"].value,}}}());function getVirtualKey(ev){if("key"in ev&&typeof ev.key!="undefined"){return ev.key}var c=ev.charCode||ev.keyCode;if(c==27){return"Escape"}return String.fromCharCode(c)}var THEME_PICKER_ELEMENT_ID="theme-picker";var THEMES_ELEMENT_ID="theme-choices";function getThemesElement(){return document.getElementById(THEMES_ELEMENT_ID)}function getThemePickerElement(){return document.getElementById(THEME_PICKER_ELEMENT_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function showThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="block";themePicker.style.borderBottomRightRadius="0";themePicker.style.borderBottomLeftRadius="0"}function hideThemeButtonState(){var themePicker=getThemePickerElement();var themeChoices=getThemesElement();themeChoices.style.display="none";themePicker.style.borderBottomRightRadius="3px";themePicker.style.borderBottomLeftRadius="3px"}(function(){var themeChoices=getThemesElement();var themePicker=getThemePickerElement();var availableThemes=["ayu","dark","light"];function switchThemeButtonState(){if(themeChoices.style.display==="block"){hideThemeButtonState()}else{showThemeButtonState()}}function handleThemeButtonsBlur(e){var active=document.activeElement;var related=e.relatedTarget;if(active.id!==THEME_PICKER_ELEMENT_ID&&(!active.parentNode||active.parentNode.id!==THEMES_ELEMENT_ID)&&(!related||(related.id!==THEME_PICKER_ELEMENT_ID&&(!related.parentNode||related.parentNode.id!==THEMES_ELEMENT_ID)))){hideThemeButtonState()}}themePicker.onclick=switchThemeButtonState;themePicker.onblur=handleThemeButtonsBlur;availableThemes.forEach(function(item){var but=document.createElement("button");but.textContent=item;but.onclick=function(){switchTheme(window.currentTheme,window.mainTheme,item,true);useSystemTheme(false)};but.onblur=handleThemeButtonsBlur;themeChoices.appendChild(but)})}());(function(){"use strict";window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:function(){return document.getElementById("search")},title:null,titleBeforeSearch:document.title,timeout:null,currentTab:0,mouseMovedAfterSearch:true,clearInputTimeout:function(){if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},focus:function(){searchState.input.focus()},defocus:function(){searchState.input.blur()},showResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(main,"hidden");removeClass(search,"hidden");searchState.mouseMovedAfterSearch=false;document.title=searchState.title},hideResults:function(search){if(search===null||typeof search==='undefined'){search=searchState.outputElement()}addClass(search,"hidden");removeClass(main,"hidden");document.title=searchState.titleBeforeSearch;if(searchState.browserSupportsHistoryApi()){history.replaceState("",window.currentCrate+" - Rust",getNakedUrl()+window.location.hash)}},getQueryStringParams:function(){var params={};window.location.search.substring(1).split("&").map(function(s){var pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},putBackSearch:function(search_input){var search=searchState.outputElement();if(search_input.value!==""&&hasClass(search,"hidden")){searchState.showResults(search);if(searchState.browserSupportsHistoryApi()){var extra="?search="+encodeURIComponent(search_input.value);history.replaceState(search_input.value,"",getNakedUrl()+extra+window.location.hash)}document.title=searchState.title}},browserSupportsHistoryApi:function(){return window.history&&typeof window.history.pushState==="function"},setup:function(){var search_input=searchState.input;if(!searchState.input){return}function loadScript(url){var script=document.createElement('script');script.src=url;document.head.append(script)}var searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(window.searchJS);loadScript(window.searchIndexJS)}}search_input.addEventListener("focus",function(){searchState.putBackSearch(this);search_input.origPlaceholder=searchState.input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});search_input.addEventListener("blur",function(){search_input.placeholder=searchState.input.origPlaceholder});document.addEventListener("mousemove",function(){searchState.mouseMovedAfterSearch=true});search_input.removeAttribute('disabled');searchState.addCrateDropdown(window.ALL_CRATES);var params=searchState.getQueryStringParams();if(params.search!==undefined){var search=searchState.outputElement();search.innerHTML="

"+searchState.loadingText+"

";searchState.showResults(search);loadSearch()}},addCrateDropdown:function(crates){var elem=document.getElementById("crate-search");if(!elem){return}var savedCrate=getSettingValue("saved-filter-crate");for(var i=0,len=crates.length;i0){return tmp}}return null}function showSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){addClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];if(sidebar){addClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(!filler){var div=document.createElement("div");div.id="sidebar-filler";sidebar.appendChild(div)}}}function hideSidebar(){var elems=document.getElementsByClassName("sidebar-elems")[0];if(elems){removeClass(elems,"show-it")}var sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"mobile");var filler=document.getElementById("sidebar-filler");if(filler){filler.remove()}document.getElementsByTagName("body")[0].style.marginTop=""}function isHidden(elem){return elem.offsetHeight===0}var toggleAllDocsId="toggle-all-docs";var main=document.getElementById("main");var savedHash="";function handleHashes(ev){var elem;var search=searchState.outputElement();if(ev!==null&&search&&!hasClass(search,"hidden")&&ev.newURL){searchState.hideResults(search);var hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(searchState.browserSupportsHistoryApi()){history.replaceState(hash,"",getNakedUrl()+window.location.search+"#"+hash)}elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}if(savedHash!==window.location.hash){savedHash=window.location.hash;if(savedHash.length===0){return}elem=document.getElementById(savedHash.slice(1));if(!elem||!isHidden(elem)){return}var parent=elem.parentNode;if(parent&&hasClass(parent,"impl-items")){onEachLazy(parent.getElementsByClassName("collapsed"),function(e){if(e.parentNode===parent){e.click();return true}});if(isHidden(elem)){if(hasClass(parent.lastElementChild,"collapse-toggle")){parent.lastElementChild.click()}}}}}function highlightSourceLines(match,ev){if(typeof match==="undefined"){hideSidebar();match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/)}if(!match){return}var from=parseInt(match[1],10);var to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(to0){collapseDocs(collapses[0],"show")}openParentDetails(h3.parentNode)}else{openParentDetails(elem.parentNode)}}}function getHelpElement(build){if(build!==false){buildHelperPopup()}return document.getElementById("help")}function displayHelp(display,ev,help){if(display===true){help=help?help:getHelpElement(true);if(hasClass(help,"hidden")){ev.preventDefault();removeClass(help,"hidden");addClass(document.body,"blur")}}else{help=help?help:getHelpElement(false);if(help&&hasClass(help,"hidden")===false){ev.preventDefault();addClass(help,"hidden");removeClass(document.body,"blur")}}}function handleEscape(ev){var help=getHelpElement(false);var search=searchState.outputElement();if(hasClass(help,"hidden")===false){displayHelp(false,ev,help)}else if(hasClass(search,"hidden")===false){searchState.clearInputTimeout();ev.preventDefault();searchState.hideResults(search)}searchState.defocus();hideThemeButtonState()}var disableShortcuts=getSettingValue("disable-shortcuts")==="true";function handleShortcut(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts===true){return}if(document.activeElement.tagName==="INPUT"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":displayHelp(false,ev);ev.preventDefault();searchState.focus();break;case"+":case"-":ev.preventDefault();toggleAllDocs();break;case"?":displayHelp(true,ev);break;case"t":case"T":displayHelp(false,ev);ev.preventDefault();var themePicker=getThemePickerElement();themePicker.click();themePicker.focus();break;default:if(getThemePickerElement().parentNode.contains(ev.target)){handleThemeKeyDown(ev)}}}}function handleThemeKeyDown(ev){var active=document.activeElement;var themes=getThemesElement();switch(getVirtualKey(ev)){case"ArrowUp":ev.preventDefault();if(active.previousElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.previousElementSibling.focus()}else{showThemeButtonState();themes.lastElementChild.focus()}break;case"ArrowDown":ev.preventDefault();if(active.nextElementSibling&&ev.target.id!==THEME_PICKER_ELEMENT_ID){active.nextElementSibling.focus()}else{showThemeButtonState();themes.firstElementChild.focus()}break;case"Enter":case"Return":case"Space":if(ev.target.id===THEME_PICKER_ELEMENT_ID&&themes.style.display==="none"){ev.preventDefault();showThemeButtonState();themes.firstElementChild.focus()}break;case"Home":ev.preventDefault();themes.firstElementChild.focus();break;case"End":ev.preventDefault();themes.lastElementChild.focus();break}}function findParentElement(elem,tagName){do{if(elem&&elem.tagName===tagName){return elem}elem=elem.parentNode}while(elem);return null}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);var handleSourceHighlight=(function(){var prev_line_id=0;var set_fragment=function(name){var x=window.scrollX,y=window.scrollY;if(searchState.browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);highlightSourceLines()}else{location.replace("#"+name)}window.scrollTo(x,y)};return function(ev){var cur_line_id=parseInt(ev.target.id,10);ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){var tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());document.addEventListener("click",function(ev){var helpElem=getHelpElement(false);if(hasClass(ev.target,"help-button")){displayHelp(true,ev)}else if(hasClass(ev.target,"collapse-toggle")){collapseDocs(ev.target,"toggle")}else if(hasClass(ev.target.parentNode,"collapse-toggle")){collapseDocs(ev.target.parentNode,"toggle")}else if(ev.target.tagName==="SPAN"&&hasClass(ev.target.parentNode,"line-numbers")){handleSourceHighlight(ev)}else if(helpElem&&hasClass(helpElem,"hidden")===false){var is_inside_help_popup=ev.target!==helpElem&&helpElem.contains(ev.target);if(is_inside_help_popup===false){addClass(helpElem,"hidden");removeClass(document.body,"blur")}}else{var a=findParentElement(ev.target,"A");if(a&&a.hash){expandSection(a.hash.replace(/^#/,""))}}});(function(){var x=document.getElementsByClassName("version-selector");if(x.length>0){x[0].onchange=function(){var i,match,url=document.location.href,stripped="",len=window.rootPath.match(/\.\.\//g).length+1;for(i=0;i"+""+"
"+code.outerHTML+"
";list.appendChild(display)}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors)}function labelForToggleButton(sectionIsCollapsed){if(sectionIsCollapsed){return"+"}return"\u2212"}function onEveryMatchingChild(elem,className,func){if(elem&&className&&func){var length=elem.childNodes.length;var nodes=elem.childNodes;for(var i=0;i"+labelForToggleButton(sectionIsCollapsed)+"]";return toggle}function createToggle(toggle,otherMessage,fontSize,extraClass,show){var span=document.createElement("span");span.className="toggle-label";if(show){span.style.display="none"}if(!otherMessage){span.innerHTML=" Expand description"}else{span.innerHTML=otherMessage}if(fontSize){span.style.fontSize=fontSize}var mainToggle=toggle.cloneNode(true);mainToggle.appendChild(span);var wrapper=document.createElement("div");wrapper.className="toggle-wrapper";if(!show){addClass(wrapper,"collapsed");var inner=mainToggle.getElementsByClassName("inner");if(inner&&inner.length>0){inner[0].innerHTML="+"}}if(extraClass){addClass(wrapper,extraClass)}wrapper.appendChild(mainToggle);return wrapper}(function(){var toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs}var toggle=createSimpleToggle(false);var hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";var hideImplementors=getSettingValue("auto-collapse-implementors")!=="false";var hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";var hideTraitImplementations=getSettingValue("auto-hide-trait-implementations")!=="false";var impl_list=document.getElementById("trait-implementations-list");if(impl_list!==null){onEachLazy(impl_list.getElementsByClassName("collapse-toggle"),function(e){collapseNonInherent(e)})}var blanket_list=document.getElementById("blanket-implementations-list");if(blanket_list!==null){onEachLazy(blanket_list.getElementsByClassName("collapse-toggle"),function(e){collapseNonInherent(e)})}var func=function(e){var next=e.nextElementSibling;if(next&&hasClass(next,"item-info")){next=next.nextElementSibling}if(!next){return}if(hasClass(next,"docblock")){var newToggle=toggle.cloneNode(true);insertAfter(newToggle,e.childNodes[e.childNodes.length-1]);if(hideMethodDocs===true&&hasClass(e,"method")===true){collapseDocs(newToggle,"hide")}}};var funcImpl=function(e){var next=e.nextElementSibling;if(next&&hasClass(next,"item-info")){next=next.nextElementSibling}if(next&&hasClass(next,"docblock")){next=next.nextElementSibling}if(!next){return}};onEachLazy(document.getElementsByClassName("method"),func);onEachLazy(document.getElementsByClassName("associatedconstant"),func);var impl_call=function(){};onEachLazy(document.getElementsByTagName("details"),function(e){var showLargeItem=!hideLargeItemContents&&hasClass(e,"type-contents-toggle");var showImplementor=!hideImplementors&&hasClass(e,"implementors-toggle");if(showLargeItem||showImplementor){e.open=true}});if(hideMethodDocs===true){impl_call=function(e,newToggle){if(e.id.match(/^impl(?:-\d+)?$/)===null){if(hasClass(e,"impl")===true){collapseDocs(newToggle,"hide")}}}}var newToggle=document.createElement("a");newToggle.href="javascript:void(0)";newToggle.className="collapse-toggle hidden-default collapsed";newToggle.innerHTML="["+labelForToggleButton(true)+"] Show hidden undocumented items";function toggleClicked(){if(hasClass(this,"collapsed")){removeClass(this,"collapsed");onEachLazy(this.parentNode.getElementsByClassName("hidden"),function(x){if(hasClass(x,"content")===false){removeClass(x,"hidden");addClass(x,"x")}},true);this.innerHTML="["+labelForToggleButton(false)+"] Hide undocumented items"}else{addClass(this,"collapsed");onEachLazy(this.parentNode.getElementsByClassName("x"),function(x){if(hasClass(x,"content")===false){addClass(x,"hidden");removeClass(x,"x")}},true);this.innerHTML="["+labelForToggleButton(true)+"] Show hidden undocumented items"}}onEachLazy(document.getElementsByClassName("impl-items"),function(e){onEachLazy(e.getElementsByClassName("associatedconstant"),func);var hiddenElems=Array.prototype.slice.call(e.getElementsByClassName("hidden"));var needToggle=hiddenElems.some(function(hiddenElem){return hasClass(hiddenElem,"content")===false&&hasClass(hiddenElem,"docblock")===false});if(needToggle===true){var inner_toggle=newToggle.cloneNode(true);inner_toggle.onclick=toggleClicked;e.insertBefore(inner_toggle,e.firstChild);impl_call(e.previousSibling,inner_toggle)}});var currentType=document.getElementsByClassName("type-decl")[0];var className=null;if(currentType){currentType=currentType.getElementsByClassName("rust")[0];if(currentType){onEachLazy(currentType.classList,function(item){if(item!=="main"){className=item;return true}})}}function buildToggleWrapper(e){if(hasClass(e,"autohide")){var wrap=e.previousElementSibling;if(wrap&&hasClass(wrap,"toggle-wrapper")){var inner_toggle=wrap.childNodes[0];var extra=e.childNodes[0].tagName==="H3";e.style.display="none";addClass(wrap,"collapsed");onEachLazy(inner_toggle.getElementsByClassName("inner"),function(e){e.innerHTML=labelForToggleButton(true)});onEachLazy(inner_toggle.getElementsByClassName("toggle-label"),function(e){e.style.display="inline-block";if(extra===true){e.innerHTML=" Show "+e.childNodes[0].innerHTML}})}}if(e.parentNode.id==="main"){var otherMessage="";var fontSize;var extraClass;if(hasClass(e,"type-decl")){return}else if(hasClass(e,"non-exhaustive")){otherMessage=" This ";if(hasClass(e,"non-exhaustive-struct")){otherMessage+="struct"}else if(hasClass(e,"non-exhaustive-enum")){otherMessage+="enum"}else if(hasClass(e,"non-exhaustive-variant")){otherMessage+="enum variant"}else if(hasClass(e,"non-exhaustive-type")){otherMessage+="type"}otherMessage+=" is marked as non-exhaustive"}else if(hasClass(e.childNodes[0],"impl-items")){extraClass="marg-left"}e.parentNode.insertBefore(createToggle(toggle,otherMessage,fontSize,extraClass,true),e);if(hasClass(e,"non-exhaustive")===true){collapseDocs(e.previousSibling.childNodes[0],"toggle")}}}onEachLazy(document.getElementsByClassName("docblock"),buildToggleWrapper);var pageId=getPageId();if(pageId!==null){expandSection(pageId)}}());(function(){var lineNumbersFunc=function(){};if(getSettingValue("line-numbers")==="true"){lineNumbersFunc=function(x){var count=x.textContent.split("\n").length;var elems=[];for(var i=0;ithe rustdoc book.";var container=document.createElement("div");var shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["T","Focus the theme picker menu"],["↑","Move up in search results"],["↓","Move down in search results"],["ctrl + ↑ / ↓","Switch result tab"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(function(x){return"
"+x[0].split(" ").map(function(y,index){return(index&1)===0?""+y+"":" "+y+" "}).join("")+"
"+x[1]+"
"}).join("");var div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";var infos=["Prefix searches with a type followed by a colon (e.g., fn:) to \ restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ enum, trait, type, macro, \ and const.","Search functions by type signature (e.g., vec -> usize or \ * -> vec)","Search multiple things at once by splitting your query with comma (e.g., \ str,u8 or String,struct:Vec,test)","You can look for items with an exact name by putting double quotes around \ - your request: \"string\"","Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");var div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;container.appendChild(book_info);container.appendChild(div_shortcuts);container.appendChild(div_infos);popup.appendChild(container);insertAfter(popup,getSearchElement());buildHelperPopup=function(){}}onHashChange(null);window.onhashchange=onHashChange}());window.onunload=function(){} \ No newline at end of file + your request: \"string\"","Look for items inside another one by searching for a path: vec::Vec",].map(function(x){return"

"+x+"

"}).join("");var div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;container.appendChild(book_info);container.appendChild(div_shortcuts);container.appendChild(div_infos);popup.appendChild(container);insertAfter(popup,searchState.outputElement());buildHelperPopup=function(){}}onHashChange(null);window.onhashchange=onHashChange;searchState.setup()}());function copy_path(but){var parent=but.parentElement;var path=[];onEach(parent.childNodes,function(child){if(child.tagName==='A'){path.push(child.textContent)}});var el=document.createElement('textarea');el.value='use '+path.join('::')+';';el.setAttribute('readonly','');el.style.position='absolute';el.style.left='-9999px';document.body.appendChild(el);el.select();document.execCommand('copy');document.body.removeChild(el);but.textContent='✓'} \ No newline at end of file diff --git a/mcaptcha/all.html b/mcaptcha/all.html index 57da956a..6094aa4e 100644 --- a/mcaptcha/all.html +++ b/mcaptcha/all.html @@ -1,7 +1,7 @@ -List of all items in this crate +List of all items in this crate -

List of all items[] +

List of all items[] -

Structs

Enums

Macros

Functions

Typedefs

Statics

Constants

- \ No newline at end of file +

Structs

Enums

Macros

Functions

Typedefs

Statics

Constants

+ \ No newline at end of file diff --git a/mcaptcha/api/index.html b/mcaptcha/api/index.html index ccd99fe0..37c23d88 100644 --- a/mcaptcha/api/index.html +++ b/mcaptcha/api/index.html @@ -1,6 +1,6 @@ -mcaptcha::api - Rust +mcaptcha::api - Rust -

Module mcaptcha::api[][src]

Modules

-
v1
- \ No newline at end of file +

Module mcaptcha::api[][src]

Modules

+
v1
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/delete/fn.services.html b/mcaptcha/api/v1/account/delete/fn.services.html index fc502ffa..21b7185b 100644 --- a/mcaptcha/api/v1/account/delete/fn.services.html +++ b/mcaptcha/api/v1/account/delete/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::account::delete::services - Rust +services in mcaptcha::api::v1::account::delete - Rust -

Function mcaptcha::api::v1::account::delete::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::account::delete::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/delete/index.html b/mcaptcha/api/v1/account/delete/index.html index c1f23efd..c4ded0b2 100644 --- a/mcaptcha/api/v1/account/delete/index.html +++ b/mcaptcha/api/v1/account/delete/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::account::delete - Rust +mcaptcha::api::v1::account::delete - Rust -

Module mcaptcha::api::v1::account::delete[][src]

Structs

+

Module mcaptcha::api::v1::account::delete[][src]

Structs

delete_account

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/delete/struct.delete_account.html b/mcaptcha/api/v1/account/delete/struct.delete_account.html index 7b579881..0dc3187d 100644 --- a/mcaptcha/api/v1/account/delete/struct.delete_account.html +++ b/mcaptcha/api/v1/account/delete/struct.delete_account.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::account::delete::delete_account - Rust +delete_account in mcaptcha::api::v1::account::delete - Rust -

Struct mcaptcha::api::v1::account::delete::delete_account[][src]

pub struct delete_account;

Trait Implementations

impl HttpServiceFactory for delete_account[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/email/fn.services.html b/mcaptcha/api/v1/account/email/fn.services.html index 1a8dcab8..ccdd14df 100644 --- a/mcaptcha/api/v1/account/email/fn.services.html +++ b/mcaptcha/api/v1/account/email/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::account::email::services - Rust +services in mcaptcha::api::v1::account::email - Rust -

Function mcaptcha::api::v1::account::email::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::account::email::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/email/index.html b/mcaptcha/api/v1/account/email/index.html index 980cfe34..18882fbe 100644 --- a/mcaptcha/api/v1/account/email/index.html +++ b/mcaptcha/api/v1/account/email/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::account::email - Rust +mcaptcha::api::v1::account::email - Rust -

Module mcaptcha::api::v1::account::email[][src]

Structs

+

Module mcaptcha::api::v1::account::email[][src]

Structs

Email
email_exists
set_email

update email

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/email/struct.Email.html b/mcaptcha/api/v1/account/email/struct.Email.html index 5a9dda57..69426d6f 100644 --- a/mcaptcha/api/v1/account/email/struct.Email.html +++ b/mcaptcha/api/v1/account/email/struct.Email.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::account::email::Email - Rust +Email in mcaptcha::api::v1::account::email - Rust -

Struct mcaptcha::api::v1::account::email::Email[][src]

pub struct Email {
+

Struct mcaptcha::api::v1::account::email::Email[][src]

pub struct Email {
     pub email: String,
 }

- Fields

email: String

Trait Implementations

impl Clone for Email[src]

impl Debug for Email[src]

impl<'de> Deserialize<'de> for Email[src]

impl Serialize for Email[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/email/struct.email_exists.html b/mcaptcha/api/v1/account/email/struct.email_exists.html index 26c0a1ff..756980bc 100644 --- a/mcaptcha/api/v1/account/email/struct.email_exists.html +++ b/mcaptcha/api/v1/account/email/struct.email_exists.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::account::email::email_exists - Rust +email_exists in mcaptcha::api::v1::account::email - Rust -

Struct mcaptcha::api::v1::account::email::email_exists[][src]

pub struct email_exists;

Trait Implementations

impl HttpServiceFactory for email_exists[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/email/struct.set_email.html b/mcaptcha/api/v1/account/email/struct.set_email.html index 0c0508d9..82faadcf 100644 --- a/mcaptcha/api/v1/account/email/struct.set_email.html +++ b/mcaptcha/api/v1/account/email/struct.set_email.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::account::email::set_email - Rust +set_email in mcaptcha::api::v1::account::email - Rust -

Struct mcaptcha::api::v1::account::email::set_email[][src]

pub struct set_email;

update email

-

Trait Implementations

impl HttpServiceFactory for set_email[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/fn.services.html b/mcaptcha/api/v1/account/fn.services.html index 4baa62ef..2c3cf39d 100644 --- a/mcaptcha/api/v1/account/fn.services.html +++ b/mcaptcha/api/v1/account/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::account::services - Rust +services in mcaptcha::api::v1::account - Rust -

Function mcaptcha::api::v1::account::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::account::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/index.html b/mcaptcha/api/v1/account/index.html index ded8399a..cfbcc743 100644 --- a/mcaptcha/api/v1/account/index.html +++ b/mcaptcha/api/v1/account/index.html @@ -1,9 +1,9 @@ -mcaptcha::api::v1::account - Rust +mcaptcha::api::v1::account - Rust -

Module mcaptcha::api::v1::account[][src]

Re-exports

-
pub use super::auth;
pub use super::mcaptcha;

Modules

+

Module mcaptcha::api::v1::account[][src]

Re-exports

+
pub use super::auth;
pub use super::mcaptcha;

Modules

delete
email
routes
secret
username

Structs

AccountCheckPayload
AccountCheckResp

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/routes/index.html b/mcaptcha/api/v1/account/routes/index.html index ca12841d..43d9ba68 100644 --- a/mcaptcha/api/v1/account/routes/index.html +++ b/mcaptcha/api/v1/account/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::account::routes - Rust +mcaptcha::api::v1::account::routes - Rust -

Module mcaptcha::api::v1::account::routes[][src]

Structs

-
Account
- \ No newline at end of file +

Module mcaptcha::api::v1::account::routes[][src]

Structs

+
Account
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/routes/struct.Account.html b/mcaptcha/api/v1/account/routes/struct.Account.html index 43005139..d20f2f0a 100644 --- a/mcaptcha/api/v1/account/routes/struct.Account.html +++ b/mcaptcha/api/v1/account/routes/struct.Account.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::account::routes::Account - Rust +Account in mcaptcha::api::v1::account::routes - Rust -

Struct mcaptcha::api::v1::account::routes::Account[][src]

pub struct Account {
+

Struct mcaptcha::api::v1::account::routes::Account[][src]

pub struct Account {
     pub delete: &'static str,
     pub email_exists: &'static str,
     pub get_secret: &'static str,
@@ -9,112 +9,108 @@
     pub update_secret: &'static str,
     pub username_exists: &'static str,
 }

- Fields

delete: &'static stremail_exists: &'static strget_secret: &'static strupdate_email: &'static strupdate_secret: &'static strusername_exists: &'static str

Implementations

impl Account[src]

pub const fn new() -> Account[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/fn.services.html b/mcaptcha/api/v1/account/secret/fn.services.html index adc0ce81..2b14559e 100644 --- a/mcaptcha/api/v1/account/secret/fn.services.html +++ b/mcaptcha/api/v1/account/secret/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::account::secret::services - Rust +services in mcaptcha::api::v1::account::secret - Rust -

Function mcaptcha::api::v1::account::secret::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::account::secret::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/index.html b/mcaptcha/api/v1/account/secret/index.html index 80238d61..b0c403a3 100644 --- a/mcaptcha/api/v1/account/secret/index.html +++ b/mcaptcha/api/v1/account/secret/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::account::secret - Rust +mcaptcha::api::v1::account::secret - Rust -

Module mcaptcha::api::v1::account::secret[][src]

Structs

+

Module mcaptcha::api::v1::account::secret[][src]

Structs

Secret
get_secret
update_user_secret

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/struct.Secret.html b/mcaptcha/api/v1/account/secret/struct.Secret.html index 00c5b780..21794396 100644 --- a/mcaptcha/api/v1/account/secret/struct.Secret.html +++ b/mcaptcha/api/v1/account/secret/struct.Secret.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::account::secret::Secret - Rust +Secret in mcaptcha::api::v1::account::secret - Rust -

Struct mcaptcha::api::v1::account::secret::Secret[][src]

pub struct Secret {
+

Struct mcaptcha::api::v1::account::secret::Secret[][src]

pub struct Secret {
     pub secret: String,
 }

- Fields

secret: String

Trait Implementations

impl Clone for Secret[src]

impl Debug for Secret[src]

impl<'de> Deserialize<'de> for Secret[src]

impl Serialize for Secret[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/struct.get_secret.html b/mcaptcha/api/v1/account/secret/struct.get_secret.html index 2e5c7957..82a294cd 100644 --- a/mcaptcha/api/v1/account/secret/struct.get_secret.html +++ b/mcaptcha/api/v1/account/secret/struct.get_secret.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::account::secret::get_secret - Rust +get_secret in mcaptcha::api::v1::account::secret - Rust -

Struct mcaptcha::api::v1::account::secret::get_secret[][src]

pub struct get_secret;

Trait Implementations

impl HttpServiceFactory for get_secret[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/struct.update_user_secret.html b/mcaptcha/api/v1/account/secret/struct.update_user_secret.html index d2a5743f..fb23983a 100644 --- a/mcaptcha/api/v1/account/secret/struct.update_user_secret.html +++ b/mcaptcha/api/v1/account/secret/struct.update_user_secret.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::account::secret::update_user_secret - Rust +update_user_secret in mcaptcha::api::v1::account::secret - Rust -

Struct mcaptcha::api::v1::account::secret::update_user_secret[][src]

pub struct update_user_secret;

Trait Implementations

impl HttpServiceFactory for update_user_secret[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/struct.AccountCheckPayload.html b/mcaptcha/api/v1/account/struct.AccountCheckPayload.html index 91e82962..74ae5f10 100644 --- a/mcaptcha/api/v1/account/struct.AccountCheckPayload.html +++ b/mcaptcha/api/v1/account/struct.AccountCheckPayload.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::account::AccountCheckPayload - Rust +AccountCheckPayload in mcaptcha::api::v1::account - Rust -

Struct mcaptcha::api::v1::account::AccountCheckPayload[][src]

pub struct AccountCheckPayload {
+

Struct mcaptcha::api::v1::account::AccountCheckPayload[][src]

pub struct AccountCheckPayload {
     pub val: String,
 }

- Fields

val: String

Trait Implementations

impl Clone for AccountCheckPayload[src]

impl Debug for AccountCheckPayload[src]

impl<'de> Deserialize<'de> for AccountCheckPayload[src]

impl Serialize for AccountCheckPayload[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/struct.AccountCheckResp.html b/mcaptcha/api/v1/account/struct.AccountCheckResp.html index 1f24eb2f..5923cd84 100644 --- a/mcaptcha/api/v1/account/struct.AccountCheckResp.html +++ b/mcaptcha/api/v1/account/struct.AccountCheckResp.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::account::AccountCheckResp - Rust +AccountCheckResp in mcaptcha::api::v1::account - Rust -

Struct mcaptcha::api::v1::account::AccountCheckResp[][src]

pub struct AccountCheckResp {
+

Struct mcaptcha::api::v1::account::AccountCheckResp[][src]

pub struct AccountCheckResp {
     pub exists: bool,
 }

- Fields

exists: bool

Trait Implementations

impl Clone for AccountCheckResp[src]

impl Debug for AccountCheckResp[src]

impl<'de> Deserialize<'de> for AccountCheckResp[src]

impl Serialize for AccountCheckResp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/username/fn.services.html b/mcaptcha/api/v1/account/username/fn.services.html index 958e7522..61824aea 100644 --- a/mcaptcha/api/v1/account/username/fn.services.html +++ b/mcaptcha/api/v1/account/username/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::account::username::services - Rust +services in mcaptcha::api::v1::account::username - Rust -

Function mcaptcha::api::v1::account::username::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::account::username::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/username/index.html b/mcaptcha/api/v1/account/username/index.html index 4e80a070..fc0d3ef7 100644 --- a/mcaptcha/api/v1/account/username/index.html +++ b/mcaptcha/api/v1/account/username/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::account::username - Rust +mcaptcha::api::v1::account::username - Rust -

Module mcaptcha::api::v1::account::username[][src]

Structs

+

Module mcaptcha::api::v1::account::username[][src]

Structs

username_exists

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/account/username/struct.username_exists.html b/mcaptcha/api/v1/account/username/struct.username_exists.html index c4119eb2..4b54c557 100644 --- a/mcaptcha/api/v1/account/username/struct.username_exists.html +++ b/mcaptcha/api/v1/account/username/struct.username_exists.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::account::username::username_exists - Rust +username_exists in mcaptcha::api::v1::account::username - Rust -

Struct mcaptcha::api::v1::account::username::username_exists[][src]

pub struct username_exists;

Trait Implementations

impl HttpServiceFactory for username_exists[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/fn.services.html b/mcaptcha/api/v1/auth/fn.services.html index 68cfcf31..ca725267 100644 --- a/mcaptcha/api/v1/auth/fn.services.html +++ b/mcaptcha/api/v1/auth/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::auth::services - Rust +services in mcaptcha::api::v1::auth - Rust -

Function mcaptcha::api::v1::auth::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::auth::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/index.html b/mcaptcha/api/v1/auth/index.html index 2d1c1428..6c2b9e65 100644 --- a/mcaptcha/api/v1/auth/index.html +++ b/mcaptcha/api/v1/auth/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::auth - Rust +mcaptcha::api::v1::auth - Rust -

Module mcaptcha::api::v1::auth[][src]

Modules

+

Module mcaptcha::api::v1::auth[][src]

Modules

routes
runners

Structs

login
register
signout

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/routes/index.html b/mcaptcha/api/v1/auth/routes/index.html index bf948051..d7726ae5 100644 --- a/mcaptcha/api/v1/auth/routes/index.html +++ b/mcaptcha/api/v1/auth/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::auth::routes - Rust +mcaptcha::api::v1::auth::routes - Rust -

Module mcaptcha::api::v1::auth::routes[][src]

Structs

-
Auth
- \ No newline at end of file +

Module mcaptcha::api::v1::auth::routes[][src]

Structs

+
Auth
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/routes/struct.Auth.html b/mcaptcha/api/v1/auth/routes/struct.Auth.html index d67c6155..a2b29262 100644 --- a/mcaptcha/api/v1/auth/routes/struct.Auth.html +++ b/mcaptcha/api/v1/auth/routes/struct.Auth.html @@ -1,117 +1,113 @@ -mcaptcha::api::v1::auth::routes::Auth - Rust +Auth in mcaptcha::api::v1::auth::routes - Rust -

Struct mcaptcha::api::v1::auth::routes::Auth[][src]

pub struct Auth {
+

Struct mcaptcha::api::v1::auth::routes::Auth[][src]

pub struct Auth {
     pub logout: &'static str,
     pub login: &'static str,
     pub register: &'static str,
 }

- Fields

logout: &'static strlogin: &'static strregister: &'static str

Implementations

impl Auth[src]

pub const fn new() -> Auth[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/fn.login_runner.html b/mcaptcha/api/v1/auth/runners/fn.login_runner.html index fe6eba3c..516fb5a6 100644 --- a/mcaptcha/api/v1/auth/runners/fn.login_runner.html +++ b/mcaptcha/api/v1/auth/runners/fn.login_runner.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::auth::runners::login_runner - Rust +login_runner in mcaptcha::api::v1::auth::runners - Rust -

Function mcaptcha::api::v1::auth::runners::login_runner[][src]

pub async fn login_runner(
    payload: Login,
    data: &AppData
) -> Result<String, ServiceError>

returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise

-
- \ No newline at end of file +

Function mcaptcha::api::v1::auth::runners::login_runner[][src]

pub async fn login_runner(
    payload: Login,
    data: &AppData
) -> Result<String, ServiceError>

returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise

+
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/fn.register_runner.html b/mcaptcha/api/v1/auth/runners/fn.register_runner.html index ba50c052..d7cb04cd 100644 --- a/mcaptcha/api/v1/auth/runners/fn.register_runner.html +++ b/mcaptcha/api/v1/auth/runners/fn.register_runner.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::auth::runners::register_runner - Rust +register_runner in mcaptcha::api::v1::auth::runners - Rust -

Function mcaptcha::api::v1::auth::runners::register_runner[][src]

pub async fn register_runner(
    payload: &Register,
    data: &AppData
) -> Result<(), ServiceError>
- \ No newline at end of file +

Function mcaptcha::api::v1::auth::runners::register_runner[][src]

pub async fn register_runner(
    payload: &Register,
    data: &AppData
) -> Result<(), ServiceError>
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/index.html b/mcaptcha/api/v1/auth/runners/index.html index 571135b5..47ec56ab 100644 --- a/mcaptcha/api/v1/auth/runners/index.html +++ b/mcaptcha/api/v1/auth/runners/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::auth::runners - Rust +mcaptcha::api::v1::auth::runners - Rust -

Module mcaptcha::api::v1::auth::runners[][src]

Structs

+

Module mcaptcha::api::v1::auth::runners[][src]

Structs

Login
Password
Register

Functions

login_runner

returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise

-
register_runner
- \ No newline at end of file +register_runner
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/struct.Login.html b/mcaptcha/api/v1/auth/runners/struct.Login.html index b16f5889..42bef48b 100644 --- a/mcaptcha/api/v1/auth/runners/struct.Login.html +++ b/mcaptcha/api/v1/auth/runners/struct.Login.html @@ -1,125 +1,121 @@ -mcaptcha::api::v1::auth::runners::Login - Rust +Login in mcaptcha::api::v1::auth::runners - Rust -

Struct mcaptcha::api::v1::auth::runners::Login[][src]

pub struct Login {
+

Struct mcaptcha::api::v1::auth::runners::Login[][src]

pub struct Login {
     pub login: String,
     pub password: String,
 }

- Fields

login: Stringpassword: String

Trait Implementations

impl Clone for Login[src]

impl Debug for Login[src]

impl<'de> Deserialize<'de> for Login[src]

impl Serialize for Login[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/struct.Password.html b/mcaptcha/api/v1/auth/runners/struct.Password.html index 587dd18b..5fff5a7b 100644 --- a/mcaptcha/api/v1/auth/runners/struct.Password.html +++ b/mcaptcha/api/v1/auth/runners/struct.Password.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::auth::runners::Password - Rust +Password in mcaptcha::api::v1::auth::runners - Rust -

Struct mcaptcha::api::v1::auth::runners::Password[][src]

pub struct Password {
+

Struct mcaptcha::api::v1::auth::runners::Password[][src]

pub struct Password {
     pub password: String,
 }

- Fields

password: String

Trait Implementations

impl Clone for Password[src]

impl Debug for Password[src]

impl<'de> Deserialize<'de> for Password[src]

impl Serialize for Password[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/struct.Register.html b/mcaptcha/api/v1/auth/runners/struct.Register.html index c658d089..a93fab43 100644 --- a/mcaptcha/api/v1/auth/runners/struct.Register.html +++ b/mcaptcha/api/v1/auth/runners/struct.Register.html @@ -1,127 +1,123 @@ -mcaptcha::api::v1::auth::runners::Register - Rust +Register in mcaptcha::api::v1::auth::runners - Rust -

Struct mcaptcha::api::v1::auth::runners::Register[][src]

pub struct Register {
+

Struct mcaptcha::api::v1::auth::runners::Register[][src]

pub struct Register {
     pub username: String,
     pub password: String,
     pub confirm_password: String,
     pub email: Option<String>,
 }

- Fields

username: Stringpassword: Stringconfirm_password: Stringemail: Option<String>

Trait Implementations

impl Clone for Register[src]

impl Debug for Register[src]

impl<'de> Deserialize<'de> for Register[src]

impl Serialize for Register[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/struct.login.html b/mcaptcha/api/v1/auth/struct.login.html index 483ad527..e8d81a0f 100644 --- a/mcaptcha/api/v1/auth/struct.login.html +++ b/mcaptcha/api/v1/auth/struct.login.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::auth::login - Rust +login in mcaptcha::api::v1::auth - Rust -

Struct mcaptcha::api::v1::auth::login[][src]

pub struct login;

Trait Implementations

impl HttpServiceFactory for login[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/struct.register.html b/mcaptcha/api/v1/auth/struct.register.html index 0d8b38d8..d4d1f795 100644 --- a/mcaptcha/api/v1/auth/struct.register.html +++ b/mcaptcha/api/v1/auth/struct.register.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::auth::register - Rust +register in mcaptcha::api::v1::auth - Rust -

Struct mcaptcha::api::v1::auth::register[][src]

pub struct register;

Trait Implementations

impl HttpServiceFactory for register[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/auth/struct.signout.html b/mcaptcha/api/v1/auth/struct.signout.html index 4d0165a0..c7474e8d 100644 --- a/mcaptcha/api/v1/auth/struct.signout.html +++ b/mcaptcha/api/v1/auth/struct.signout.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::auth::signout - Rust +signout in mcaptcha::api::v1::auth - Rust -

Struct mcaptcha::api::v1::auth::signout[][src]

pub struct signout;

Trait Implementations

impl HttpServiceFactory for signout[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/fn.services.html b/mcaptcha/api/v1/fn.services.html index 67962d41..ba2b3a84 100644 --- a/mcaptcha/api/v1/fn.services.html +++ b/mcaptcha/api/v1/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::services - Rust +services in mcaptcha::api::v1 - Rust -

Function mcaptcha::api::v1::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/index.html b/mcaptcha/api/v1/index.html index 3dfdfcf3..64a41312 100644 --- a/mcaptcha/api/v1/index.html +++ b/mcaptcha/api/v1/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1 - Rust +mcaptcha::api::v1 - Rust -

Module mcaptcha::api::v1[][src]

Re-exports

-
pub use routes::ROUTES;

Modules

+

Module mcaptcha::api::v1[][src]

Re-exports

+
pub use routes::ROUTES;

Modules

account
auth
mcaptcha
meta
notifications
pow
routes

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/fn.add_mcaptcha_util.html b/mcaptcha/api/v1/mcaptcha/captcha/fn.add_mcaptcha_util.html index 52a7ae68..68101b19 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/fn.add_mcaptcha_util.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/fn.add_mcaptcha_util.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::captcha::add_mcaptcha_util - Rust +add_mcaptcha_util in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Function mcaptcha::api::v1::mcaptcha::captcha::add_mcaptcha_util[][src]

pub async fn add_mcaptcha_util(
    duration: u32,
    description: &str,
    data: &AppData,
    id: &Identity
) -> Result<MCaptchaDetails, ServiceError>
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::captcha::add_mcaptcha_util[][src]

pub async fn add_mcaptcha_util(
    duration: u32,
    description: &str,
    data: &AppData,
    id: &Identity
) -> Result<MCaptchaDetails, ServiceError>
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/fn.services.html b/mcaptcha/api/v1/mcaptcha/captcha/fn.services.html index d39e29e2..9b8c5ab4 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/fn.services.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::captcha::services - Rust +services in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Function mcaptcha::api::v1::mcaptcha::captcha::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::captcha::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/fn.update_token_helper.html b/mcaptcha/api/v1/mcaptcha/captcha/fn.update_token_helper.html index 2b45455f..2b458e04 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/fn.update_token_helper.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/fn.update_token_helper.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::captcha::update_token_helper - Rust +update_token_helper in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Function mcaptcha::api::v1::mcaptcha::captcha::update_token_helper[][src]

async fn update_token_helper(
    key: &str,
    old_key: &str,
    username: &str,
    data: &AppData
) -> Result<(), Error>
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::captcha::update_token_helper[][src]

async fn update_token_helper(
    key: &str,
    old_key: &str,
    username: &str,
    data: &AppData
) -> Result<(), Error>
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/index.html b/mcaptcha/api/v1/mcaptcha/captcha/index.html index ce38b136..c7bbb201 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/index.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::mcaptcha::captcha - Rust +mcaptcha::api::v1::mcaptcha::captcha - Rust -

Module mcaptcha::api::v1::mcaptcha::captcha[][src]

Modules

+

Module mcaptcha::api::v1::mcaptcha::captcha[][src]

Modules

routes

Structs

MCaptchaDetails
MCaptchaID
delete_mcaptcha
get_token
update_token

Functions

-
add_mcaptcha_util
services
update_token_helper
- \ No newline at end of file +
add_mcaptcha_util
services
update_token_helper
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/routes/index.html b/mcaptcha/api/v1/mcaptcha/captcha/routes/index.html index fd920f49..e3b1e7d3 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/routes/index.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::mcaptcha::captcha::routes - Rust +mcaptcha::api::v1::mcaptcha::captcha::routes - Rust -

Module mcaptcha::api::v1::mcaptcha::captcha::routes[][src]

Structs

-
MCaptcha
- \ No newline at end of file +

Module mcaptcha::api::v1::mcaptcha::captcha::routes[][src]

Structs

+
MCaptcha
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/routes/struct.MCaptcha.html b/mcaptcha/api/v1/mcaptcha/captcha/routes/struct.MCaptcha.html index 83118ac0..53df6ef2 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/routes/struct.MCaptcha.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/routes/struct.MCaptcha.html @@ -1,117 +1,113 @@ -mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha - Rust +MCaptcha in mcaptcha::api::v1::mcaptcha::captcha::routes - Rust -

Struct mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha[][src]

pub struct MCaptcha {
+

Struct mcaptcha::api::v1::mcaptcha::captcha::routes::MCaptcha[][src]

pub struct MCaptcha {
     pub delete: &'static str,
     pub get_token: &'static str,
     pub update_key: &'static str,
 }

- Fields

delete: &'static strget_token: &'static strupdate_key: &'static str

Implementations

impl MCaptcha[src]

pub const fn new() -> MCaptcha[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaDetails.html b/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaDetails.html index 262706f6..11372b8f 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaDetails.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaDetails.html @@ -1,125 +1,121 @@ -mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails - Rust +MCaptchaDetails in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Struct mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails[][src]

pub struct MCaptchaDetails {
+

Struct mcaptcha::api::v1::mcaptcha::captcha::MCaptchaDetails[][src]

pub struct MCaptchaDetails {
     pub name: String,
     pub key: String,
 }

- Fields

name: Stringkey: String

Trait Implementations

impl Clone for MCaptchaDetails[src]

impl Debug for MCaptchaDetails[src]

impl<'de> Deserialize<'de> for MCaptchaDetails[src]

impl Serialize for MCaptchaDetails[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaID.html b/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaID.html index 3355fe20..24fbf7e4 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaID.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/struct.MCaptchaID.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID - Rust +MCaptchaID in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Struct mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID[][src]

pub struct MCaptchaID {
+

Struct mcaptcha::api::v1::mcaptcha::captcha::MCaptchaID[][src]

pub struct MCaptchaID {
     pub name: Option<String>,
 }

- Fields

name: Option<String>

Trait Implementations

impl Clone for MCaptchaID[src]

impl Debug for MCaptchaID[src]

impl<'de> Deserialize<'de> for MCaptchaID[src]

impl Serialize for MCaptchaID[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/struct.delete_mcaptcha.html b/mcaptcha/api/v1/mcaptcha/captcha/struct.delete_mcaptcha.html index e47b938d..326514fb 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/struct.delete_mcaptcha.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/struct.delete_mcaptcha.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha - Rust +delete_mcaptcha in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Struct mcaptcha::api::v1::mcaptcha::captcha::delete_mcaptcha[][src]

pub struct delete_mcaptcha;

Trait Implementations

impl HttpServiceFactory for delete_mcaptcha[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/struct.get_token.html b/mcaptcha/api/v1/mcaptcha/captcha/struct.get_token.html index 24a5f257..8caf1a80 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/struct.get_token.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/struct.get_token.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::captcha::get_token - Rust +get_token in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Struct mcaptcha::api::v1::mcaptcha::captcha::get_token[][src]

pub struct get_token;

Trait Implementations

impl HttpServiceFactory for get_token[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/captcha/struct.update_token.html b/mcaptcha/api/v1/mcaptcha/captcha/struct.update_token.html index 05f9c972..e4bae5e5 100644 --- a/mcaptcha/api/v1/mcaptcha/captcha/struct.update_token.html +++ b/mcaptcha/api/v1/mcaptcha/captcha/struct.update_token.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::captcha::update_token - Rust +update_token in mcaptcha::api::v1::mcaptcha::captcha - Rust -

Struct mcaptcha::api::v1::mcaptcha::captcha::update_token[][src]

pub struct update_token;

Trait Implementations

impl HttpServiceFactory for update_token[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/fn.services.html b/mcaptcha/api/v1/mcaptcha/duration/fn.services.html index 4d02410f..e3ed9767 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/fn.services.html +++ b/mcaptcha/api/v1/mcaptcha/duration/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::duration::services - Rust +services in mcaptcha::api::v1::mcaptcha::duration - Rust -

Function mcaptcha::api::v1::mcaptcha::duration::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::duration::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/index.html b/mcaptcha/api/v1/mcaptcha/duration/index.html index 94bfc92d..7db15e6a 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/index.html +++ b/mcaptcha/api/v1/mcaptcha/duration/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::mcaptcha::duration - Rust +mcaptcha::api::v1::mcaptcha::duration - Rust -

Module mcaptcha::api::v1::mcaptcha::duration[][src]

Modules

+

Module mcaptcha::api::v1::mcaptcha::duration[][src]

Modules

routes

Structs

GetDuration
GetDurationResp
UpdateDuration
get_duration
update_duration

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/routes/index.html b/mcaptcha/api/v1/mcaptcha/duration/routes/index.html index 7760efeb..7a42d738 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/routes/index.html +++ b/mcaptcha/api/v1/mcaptcha/duration/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::mcaptcha::duration::routes - Rust +mcaptcha::api::v1::mcaptcha::duration::routes - Rust -

Module mcaptcha::api::v1::mcaptcha::duration::routes[][src]

Structs

-
Duration
- \ No newline at end of file +

Module mcaptcha::api::v1::mcaptcha::duration::routes[][src]

Structs

+
Duration
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/routes/struct.Duration.html b/mcaptcha/api/v1/mcaptcha/duration/routes/struct.Duration.html index e2d8d55f..1efe1a31 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/routes/struct.Duration.html +++ b/mcaptcha/api/v1/mcaptcha/duration/routes/struct.Duration.html @@ -1,116 +1,112 @@ -mcaptcha::api::v1::mcaptcha::duration::routes::Duration - Rust +Duration in mcaptcha::api::v1::mcaptcha::duration::routes - Rust -

Struct mcaptcha::api::v1::mcaptcha::duration::routes::Duration[][src]

pub struct Duration {
+

Struct mcaptcha::api::v1::mcaptcha::duration::routes::Duration[][src]

pub struct Duration {
     pub update: &'static str,
     pub get: &'static str,
 }

- Fields

update: &'static strget: &'static str

Implementations

impl Duration[src]

pub const fn new() -> Duration[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/struct.GetDuration.html b/mcaptcha/api/v1/mcaptcha/duration/struct.GetDuration.html index 25073ab2..2f31ad20 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/struct.GetDuration.html +++ b/mcaptcha/api/v1/mcaptcha/duration/struct.GetDuration.html @@ -1,117 +1,113 @@ -mcaptcha::api::v1::mcaptcha::duration::GetDuration - Rust +GetDuration in mcaptcha::api::v1::mcaptcha::duration - Rust -

Struct mcaptcha::api::v1::mcaptcha::duration::GetDuration[][src]

pub struct GetDuration {
+

Struct mcaptcha::api::v1::mcaptcha::duration::GetDuration[][src]

pub struct GetDuration {
     pub token: String,
 }

- Fields

token: String

Trait Implementations

impl<'de> Deserialize<'de> for GetDuration[src]

impl Serialize for GetDuration[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/struct.GetDurationResp.html b/mcaptcha/api/v1/mcaptcha/duration/struct.GetDurationResp.html index 712382bd..bf67609a 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/struct.GetDurationResp.html +++ b/mcaptcha/api/v1/mcaptcha/duration/struct.GetDurationResp.html @@ -1,117 +1,113 @@ -mcaptcha::api::v1::mcaptcha::duration::GetDurationResp - Rust +GetDurationResp in mcaptcha::api::v1::mcaptcha::duration - Rust -

Struct mcaptcha::api::v1::mcaptcha::duration::GetDurationResp[][src]

pub struct GetDurationResp {
+

Struct mcaptcha::api::v1::mcaptcha::duration::GetDurationResp[][src]

pub struct GetDurationResp {
     pub duration: i32,
 }

- Fields

duration: i32

Trait Implementations

impl<'de> Deserialize<'de> for GetDurationResp[src]

impl Serialize for GetDurationResp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/struct.UpdateDuration.html b/mcaptcha/api/v1/mcaptcha/duration/struct.UpdateDuration.html index 59a99583..f3078de7 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/struct.UpdateDuration.html +++ b/mcaptcha/api/v1/mcaptcha/duration/struct.UpdateDuration.html @@ -1,118 +1,114 @@ -mcaptcha::api::v1::mcaptcha::duration::UpdateDuration - Rust +UpdateDuration in mcaptcha::api::v1::mcaptcha::duration - Rust -

Struct mcaptcha::api::v1::mcaptcha::duration::UpdateDuration[][src]

pub struct UpdateDuration {
+

Struct mcaptcha::api::v1::mcaptcha::duration::UpdateDuration[][src]

pub struct UpdateDuration {
     pub key: String,
     pub duration: i32,
 }

- Fields

key: Stringduration: i32

Trait Implementations

impl<'de> Deserialize<'de> for UpdateDuration[src]

impl Serialize for UpdateDuration[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/struct.get_duration.html b/mcaptcha/api/v1/mcaptcha/duration/struct.get_duration.html index 1dfbb3d0..84769280 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/struct.get_duration.html +++ b/mcaptcha/api/v1/mcaptcha/duration/struct.get_duration.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::duration::get_duration - Rust +get_duration in mcaptcha::api::v1::mcaptcha::duration - Rust -

Struct mcaptcha::api::v1::mcaptcha::duration::get_duration[][src]

pub struct get_duration;

Trait Implementations

impl HttpServiceFactory for get_duration[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/duration/struct.update_duration.html b/mcaptcha/api/v1/mcaptcha/duration/struct.update_duration.html index b67b90cc..065b08a0 100644 --- a/mcaptcha/api/v1/mcaptcha/duration/struct.update_duration.html +++ b/mcaptcha/api/v1/mcaptcha/duration/struct.update_duration.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::duration::update_duration - Rust +update_duration in mcaptcha::api::v1::mcaptcha::duration - Rust -

Struct mcaptcha::api::v1::mcaptcha::duration::update_duration[][src]

pub struct update_duration;

Trait Implementations

impl HttpServiceFactory for update_duration[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/fn.get_random.html b/mcaptcha/api/v1/mcaptcha/fn.get_random.html index 5fc68040..04e57ddc 100644 --- a/mcaptcha/api/v1/mcaptcha/fn.get_random.html +++ b/mcaptcha/api/v1/mcaptcha/fn.get_random.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::get_random - Rust +get_random in mcaptcha::api::v1::mcaptcha - Rust -

Function mcaptcha::api::v1::mcaptcha::get_random[][src]

pub fn get_random(len: usize) -> String
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::get_random[][src]

pub fn get_random(len: usize) -> String
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/fn.services.html b/mcaptcha/api/v1/mcaptcha/fn.services.html index 5ecdd715..b41f26ed 100644 --- a/mcaptcha/api/v1/mcaptcha/fn.services.html +++ b/mcaptcha/api/v1/mcaptcha/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::services - Rust +services in mcaptcha::api::v1::mcaptcha - Rust -

Function mcaptcha::api::v1::mcaptcha::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/index.html b/mcaptcha/api/v1/mcaptcha/index.html index 6c448eb3..39ce59a0 100644 --- a/mcaptcha/api/v1/mcaptcha/index.html +++ b/mcaptcha/api/v1/mcaptcha/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::mcaptcha - Rust +mcaptcha::api::v1::mcaptcha - Rust -

Module mcaptcha::api::v1::mcaptcha[][src]

Modules

+

Module mcaptcha::api::v1::mcaptcha[][src]

Modules

captcha
duration
levels

Functions

-
get_random
services
- \ No newline at end of file +
get_random
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/fn.get_levels_util.html b/mcaptcha/api/v1/mcaptcha/levels/fn.get_levels_util.html index 74125e88..ed664bd2 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/fn.get_levels_util.html +++ b/mcaptcha/api/v1/mcaptcha/levels/fn.get_levels_util.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::levels::get_levels_util - Rust +get_levels_util in mcaptcha::api::v1::mcaptcha::levels - Rust -

Function mcaptcha::api::v1::mcaptcha::levels::get_levels_util[][src]

async fn get_levels_util(
    key: &str,
    username: &str,
    data: &AppData
) -> Result<Vec<I32Levels>, ServiceError>
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::levels::get_levels_util[][src]

async fn get_levels_util(
    key: &str,
    username: &str,
    data: &AppData
) -> Result<Vec<I32Levels>, ServiceError>
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/fn.services.html b/mcaptcha/api/v1/mcaptcha/levels/fn.services.html index 4ab67bbc..613a7962 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/fn.services.html +++ b/mcaptcha/api/v1/mcaptcha/levels/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::mcaptcha::levels::services - Rust +services in mcaptcha::api::v1::mcaptcha::levels - Rust -

Function mcaptcha::api::v1::mcaptcha::levels::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::mcaptcha::levels::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/index.html b/mcaptcha/api/v1/mcaptcha/levels/index.html index 2647cb75..fe27d521 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/index.html +++ b/mcaptcha/api/v1/mcaptcha/levels/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::mcaptcha::levels - Rust +mcaptcha::api::v1::mcaptcha::levels - Rust -

Module mcaptcha::api::v1::mcaptcha::levels[][src]

Modules

+

Module mcaptcha::api::v1::mcaptcha::levels[][src]

Modules

routes

Structs

AddLevels
I32Levels
Levels
UpdateLevels
add_levels
delete_levels
get_levels
update_levels

Functions

-
get_levels_util
services
- \ No newline at end of file +
get_levels_util
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/routes/index.html b/mcaptcha/api/v1/mcaptcha/levels/routes/index.html index 9b917379..f3e624e7 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/routes/index.html +++ b/mcaptcha/api/v1/mcaptcha/levels/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::mcaptcha::levels::routes - Rust +mcaptcha::api::v1::mcaptcha::levels::routes - Rust -

Module mcaptcha::api::v1::mcaptcha::levels::routes[][src]

Structs

-
Levels
- \ No newline at end of file +

Module mcaptcha::api::v1::mcaptcha::levels::routes[][src]

Structs

+
Levels
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/routes/struct.Levels.html b/mcaptcha/api/v1/mcaptcha/levels/routes/struct.Levels.html index a9b4e524..38024913 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/routes/struct.Levels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/routes/struct.Levels.html @@ -1,118 +1,114 @@ -mcaptcha::api::v1::mcaptcha::levels::routes::Levels - Rust +Levels in mcaptcha::api::v1::mcaptcha::levels::routes - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::routes::Levels[][src]

pub struct Levels {
+

Struct mcaptcha::api::v1::mcaptcha::levels::routes::Levels[][src]

pub struct Levels {
     pub add: &'static str,
     pub delete: &'static str,
     pub get: &'static str,
     pub update: &'static str,
 }

- Fields

add: &'static strdelete: &'static strget: &'static strupdate: &'static str

Implementations

impl Levels[src]

pub const fn new() -> Levels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.AddLevels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.AddLevels.html index 882c8434..4be34223 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.AddLevels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.AddLevels.html @@ -1,119 +1,115 @@ -mcaptcha::api::v1::mcaptcha::levels::AddLevels - Rust +AddLevels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::AddLevels[][src]

pub struct AddLevels {
+

Struct mcaptcha::api::v1::mcaptcha::levels::AddLevels[][src]

pub struct AddLevels {
     pub levels: Vec<Level>,
     pub duration: u32,
     pub description: String,
 }

- Fields

levels: Vec<Level>duration: u32description: String

Trait Implementations

impl<'de> Deserialize<'de> for AddLevels[src]

impl Serialize for AddLevels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.I32Levels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.I32Levels.html index c1970170..98897d52 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.I32Levels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.I32Levels.html @@ -1,125 +1,121 @@ -mcaptcha::api::v1::mcaptcha::levels::I32Levels - Rust +I32Levels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::I32Levels[][src]

pub struct I32Levels {
+

Struct mcaptcha::api::v1::mcaptcha::levels::I32Levels[][src]

pub struct I32Levels {
     pub difficulty_factor: i32,
     pub visitor_threshold: i32,
 }

- Fields

difficulty_factor: i32visitor_threshold: i32

Trait Implementations

impl Clone for I32Levels[src]

impl Debug for I32Levels[src]

impl<'de> Deserialize<'de> for I32Levels[src]

impl Serialize for I32Levels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.Levels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.Levels.html index 26e09e29..fabdf373 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.Levels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.Levels.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::mcaptcha::levels::Levels - Rust +Levels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::Levels[][src]

pub struct Levels {
-    levels: I32Levels,
+

Struct mcaptcha::api::v1::mcaptcha::levels::Levels[][src]

pub struct Levels {
+    levels: I32Levels,
 }

- Fields

levels: I32Levels

Trait Implementations

impl Clone for Levels[src]

impl Debug for Levels[src]

impl<'de> Deserialize<'de> for Levels[src]

impl Serialize for Levels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.UpdateLevels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.UpdateLevels.html index 84e6b9ff..a6dc924b 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.UpdateLevels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.UpdateLevels.html @@ -1,119 +1,115 @@ -mcaptcha::api::v1::mcaptcha::levels::UpdateLevels - Rust +UpdateLevels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::UpdateLevels[][src]

pub struct UpdateLevels {
+

Struct mcaptcha::api::v1::mcaptcha::levels::UpdateLevels[][src]

pub struct UpdateLevels {
     pub levels: Vec<Level>,
     pub key: String,
 }

Fields

levels: Vec<Level>key: String

name is config_name

-

Trait Implementations

impl<'de> Deserialize<'de> for UpdateLevels[src]

impl Serialize for UpdateLevels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

Trait Implementations

impl<'de> Deserialize<'de> for UpdateLevels[src]

impl Serialize for UpdateLevels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.add_levels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.add_levels.html index e0dd312c..3107b4f7 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.add_levels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.add_levels.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::levels::add_levels - Rust +add_levels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::add_levels[][src]

pub struct add_levels;

Trait Implementations

impl HttpServiceFactory for add_levels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.delete_levels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.delete_levels.html index 1bef3ad3..74d35861 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.delete_levels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.delete_levels.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::levels::delete_levels - Rust +delete_levels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::delete_levels[][src]

pub struct delete_levels;

Trait Implementations

impl HttpServiceFactory for delete_levels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.get_levels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.get_levels.html index d92c26eb..4298b583 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.get_levels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.get_levels.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::levels::get_levels - Rust +get_levels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::get_levels[][src]

pub struct get_levels;

Trait Implementations

impl HttpServiceFactory for get_levels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/levels/struct.update_levels.html b/mcaptcha/api/v1/mcaptcha/levels/struct.update_levels.html index 4f04290a..fa3b4056 100644 --- a/mcaptcha/api/v1/mcaptcha/levels/struct.update_levels.html +++ b/mcaptcha/api/v1/mcaptcha/levels/struct.update_levels.html @@ -1,112 +1,108 @@ -mcaptcha::api::v1::mcaptcha::levels::update_levels - Rust +update_levels in mcaptcha::api::v1::mcaptcha::levels - Rust -

Struct mcaptcha::api::v1::mcaptcha::levels::update_levels[][src]

pub struct update_levels;

Trait Implementations

impl HttpServiceFactory for update_levels[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/enum.BuildDetailsBuilderError.html b/mcaptcha/api/v1/meta/enum.BuildDetailsBuilderError.html index e1ec4884..b829b790 100644 --- a/mcaptcha/api/v1/meta/enum.BuildDetailsBuilderError.html +++ b/mcaptcha/api/v1/meta/enum.BuildDetailsBuilderError.html @@ -1,7 +1,8 @@ -mcaptcha::api::v1::meta::BuildDetailsBuilderError - Rust +BuildDetailsBuilderError in mcaptcha::api::v1::meta - Rust -

Enum mcaptcha::api::v1::meta::BuildDetailsBuilderError[][src]

#[non_exhaustive]pub enum BuildDetailsBuilderError {
+

Enum mcaptcha::api::v1::meta::BuildDetailsBuilderError[][src]

#[non_exhaustive]
+pub enum BuildDetailsBuilderError {
     UninitializedField(&'static str),
     ValidationError(String),
 }

Error type for BuildDetailsBuilder

@@ -9,121 +10,117 @@ Variants (Non-exhaustive)
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
UninitializedField(&'static str)

Uninitialized field

ValidationError(String)

Custom validation error

-

Trait Implementations

impl Debug for BuildDetailsBuilderError[src]

impl Display for BuildDetailsBuilderError[src]

impl Error for BuildDetailsBuilderError[src]

impl From<String> for BuildDetailsBuilderError[src]

impl From<UninitializedFieldError> for BuildDetailsBuilderError[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Trait Implementations

impl Debug for BuildDetailsBuilderError[src]

impl Display for BuildDetailsBuilderError[src]

impl Error for BuildDetailsBuilderError[src]

impl From<String> for BuildDetailsBuilderError[src]

impl From<UninitializedFieldError> for BuildDetailsBuilderError[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/enum.HealthBuilderError.html b/mcaptcha/api/v1/meta/enum.HealthBuilderError.html index 861957d6..312a0cd3 100644 --- a/mcaptcha/api/v1/meta/enum.HealthBuilderError.html +++ b/mcaptcha/api/v1/meta/enum.HealthBuilderError.html @@ -1,7 +1,8 @@ -mcaptcha::api::v1::meta::HealthBuilderError - Rust +HealthBuilderError in mcaptcha::api::v1::meta - Rust -

Enum mcaptcha::api::v1::meta::HealthBuilderError[][src]

#[non_exhaustive]pub enum HealthBuilderError {
+

Enum mcaptcha::api::v1::meta::HealthBuilderError[][src]

#[non_exhaustive]
+pub enum HealthBuilderError {
     UninitializedField(&'static str),
     ValidationError(String),
 }

Error type for HealthBuilder

@@ -9,121 +10,117 @@ Variants (Non-exhaustive)
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
UninitializedField(&'static str)

Uninitialized field

ValidationError(String)

Custom validation error

-

Trait Implementations

impl Debug for HealthBuilderError[src]

impl Display for HealthBuilderError[src]

impl Error for HealthBuilderError[src]

impl From<String> for HealthBuilderError[src]

impl From<UninitializedFieldError> for HealthBuilderError[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Trait Implementations

impl Debug for HealthBuilderError[src]

impl Display for HealthBuilderError[src]

impl Error for HealthBuilderError[src]

impl From<String> for HealthBuilderError[src]

impl From<UninitializedFieldError> for HealthBuilderError[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/fn.services.html b/mcaptcha/api/v1/meta/fn.services.html index 6d6eff55..30b3818d 100644 --- a/mcaptcha/api/v1/meta/fn.services.html +++ b/mcaptcha/api/v1/meta/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::meta::services - Rust +services in mcaptcha::api::v1::meta - Rust -

Function mcaptcha::api::v1::meta::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::meta::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/index.html b/mcaptcha/api/v1/meta/index.html index d364cda8..e14a96b1 100644 --- a/mcaptcha/api/v1/meta/index.html +++ b/mcaptcha/api/v1/meta/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::meta - Rust +mcaptcha::api::v1::meta - Rust -

Module mcaptcha::api::v1::meta[][src]

Modules

+

Module mcaptcha::api::v1::meta[][src]

Modules

routes

Structs

BuildDetails
BuildDetailsBuilder

Builder for BuildDetails.

Health

Health check return datatype

@@ -12,5 +12,5 @@
BuildDetailsBuilderError

Error type for BuildDetailsBuilder

HealthBuilderError

Error type for HealthBuilder

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/routes/index.html b/mcaptcha/api/v1/meta/routes/index.html index f3f91ea1..ec8a5c57 100644 --- a/mcaptcha/api/v1/meta/routes/index.html +++ b/mcaptcha/api/v1/meta/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::meta::routes - Rust +mcaptcha::api::v1::meta::routes - Rust -

Module mcaptcha::api::v1::meta::routes[][src]

Structs

-
Meta
- \ No newline at end of file +

Module mcaptcha::api::v1::meta::routes[][src]

Structs

+
Meta
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/routes/struct.Meta.html b/mcaptcha/api/v1/meta/routes/struct.Meta.html index bc9aaaa6..0bc17a72 100644 --- a/mcaptcha/api/v1/meta/routes/struct.Meta.html +++ b/mcaptcha/api/v1/meta/routes/struct.Meta.html @@ -1,116 +1,112 @@ -mcaptcha::api::v1::meta::routes::Meta - Rust +Meta in mcaptcha::api::v1::meta::routes - Rust -

Struct mcaptcha::api::v1::meta::routes::Meta[][src]

pub struct Meta {
+

Struct mcaptcha::api::v1::meta::routes::Meta[][src]

pub struct Meta {
     pub build_details: &'static str,
     pub health: &'static str,
 }

- Fields

build_details: &'static strhealth: &'static str

Implementations

impl Meta[src]

pub const fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/struct.BuildDetails.html b/mcaptcha/api/v1/meta/struct.BuildDetails.html index d7951d44..a7385ee5 100644 --- a/mcaptcha/api/v1/meta/struct.BuildDetails.html +++ b/mcaptcha/api/v1/meta/struct.BuildDetails.html @@ -1,125 +1,121 @@ -mcaptcha::api::v1::meta::BuildDetails - Rust +BuildDetails in mcaptcha::api::v1::meta - Rust -

Struct mcaptcha::api::v1::meta::BuildDetails[][src]

pub struct BuildDetails {
+

Struct mcaptcha::api::v1::meta::BuildDetails[][src]

pub struct BuildDetails {
     pub version: &'static str,
     pub git_commit_hash: &'static str,
 }

- Fields

version: &'static strgit_commit_hash: &'static str

Trait Implementations

impl Clone for BuildDetails[src]

impl Debug for BuildDetails[src]

impl Deserialize<'static> for BuildDetails[src]

impl Serialize for BuildDetails[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/struct.BuildDetailsBuilder.html b/mcaptcha/api/v1/meta/struct.BuildDetailsBuilder.html index c4a00084..c9599dc1 100644 --- a/mcaptcha/api/v1/meta/struct.BuildDetailsBuilder.html +++ b/mcaptcha/api/v1/meta/struct.BuildDetailsBuilder.html @@ -1,127 +1,123 @@ -mcaptcha::api::v1::meta::BuildDetailsBuilder - Rust +BuildDetailsBuilder in mcaptcha::api::v1::meta - Rust -

Struct mcaptcha::api::v1::meta::BuildDetailsBuilder[][src]

pub struct BuildDetailsBuilder {
+

Struct mcaptcha::api::v1::meta::BuildDetailsBuilder[][src]

pub struct BuildDetailsBuilder {
     version: Option<&'static str>,
     git_commit_hash: Option<&'static str>,
 }

Builder for BuildDetails.

- Fields

version: Option<&'static str>git_commit_hash: Option<&'static str>

Implementations

impl BuildDetailsBuilder[src]

pub fn version(&mut self, value: &'static str) -> &mut Self[src]

pub fn git_commit_hash(&mut self, value: &'static str) -> &mut Self[src]

pub fn build(&self) -> Result<BuildDetails, BuildDetailsBuilderError>[src]

Builds a new BuildDetails.

+ Fieldsversion: Option<&'static str>git_commit_hash: Option<&'static str>

Implementations

impl BuildDetailsBuilder[src]

pub fn version(&mut self, value: &'static str) -> &mut Self[src]

pub fn git_commit_hash(&mut self, value: &'static str) -> &mut Self[src]

pub fn build(&self) -> Result<BuildDetails, BuildDetailsBuilderError>[src]

Builds a new BuildDetails.

Errors

If a required field has not been initialized.

-

Trait Implementations

impl Clone for BuildDetailsBuilder[src]

impl Default for BuildDetailsBuilder[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Trait Implementations

impl Clone for BuildDetailsBuilder[src]

impl Default for BuildDetailsBuilder[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

-

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

+

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/struct.Health.html b/mcaptcha/api/v1/meta/struct.Health.html index 84568236..5891db6a 100644 --- a/mcaptcha/api/v1/meta/struct.Health.html +++ b/mcaptcha/api/v1/meta/struct.Health.html @@ -1,126 +1,122 @@ -mcaptcha::api::v1::meta::Health - Rust +Health in mcaptcha::api::v1::meta - Rust -

Struct mcaptcha::api::v1::meta::Health[][src]

pub struct Health {
+

Struct mcaptcha::api::v1::meta::Health[][src]

pub struct Health {
     db: bool,
     redis: Option<bool>,
 }

Health check return datatype

- Fields

db: boolredis: Option<bool>

Implementations

impl Health[src]

fn is_redis(redis: &Option<bool>) -> bool[src]

Trait Implementations

impl Clone for Health[src]

impl Debug for Health[src]

impl<'de> Deserialize<'de> for Health[src]

impl Serialize for Health[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/struct.HealthBuilder.html b/mcaptcha/api/v1/meta/struct.HealthBuilder.html index 3ceaa725..f6e8b4e5 100644 --- a/mcaptcha/api/v1/meta/struct.HealthBuilder.html +++ b/mcaptcha/api/v1/meta/struct.HealthBuilder.html @@ -1,127 +1,123 @@ -mcaptcha::api::v1::meta::HealthBuilder - Rust +HealthBuilder in mcaptcha::api::v1::meta - Rust -

Struct mcaptcha::api::v1::meta::HealthBuilder[][src]

pub struct HealthBuilder {
+

Struct mcaptcha::api::v1::meta::HealthBuilder[][src]

pub struct HealthBuilder {
     db: Option<bool>,
     redis: Option<Option<bool>>,
 }

Builder for Health.

- Fields

db: Option<bool>redis: Option<Option<bool>>

Implementations

impl HealthBuilder[src]

pub fn db(&mut self, value: bool) -> &mut Self[src]

pub fn redis(&mut self, value: Option<bool>) -> &mut Self[src]

pub fn build(&self) -> Result<Health, HealthBuilderError>[src]

Builds a new Health.

+ Fieldsdb: Option<bool>redis: Option<Option<bool>>

Implementations

impl HealthBuilder[src]

pub fn db(&mut self, value: bool) -> &mut Self[src]

pub fn redis(&mut self, value: Option<bool>) -> &mut Self[src]

pub fn build(&self) -> Result<Health, HealthBuilderError>[src]

Builds a new Health.

Errors

If a required field has not been initialized.

-

Trait Implementations

impl Clone for HealthBuilder[src]

impl Default for HealthBuilder[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Trait Implementations

impl Clone for HealthBuilder[src]

impl Default for HealthBuilder[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

-

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

+

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/struct.build_details.html b/mcaptcha/api/v1/meta/struct.build_details.html index 57bef027..ed7b73d3 100644 --- a/mcaptcha/api/v1/meta/struct.build_details.html +++ b/mcaptcha/api/v1/meta/struct.build_details.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::meta::build_details - Rust +build_details in mcaptcha::api::v1::meta - Rust -

Struct mcaptcha::api::v1::meta::build_details[][src]

pub struct build_details;

emmits build details of the bninary

-

Trait Implementations

impl HttpServiceFactory for build_details[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/meta/struct.health.html b/mcaptcha/api/v1/meta/struct.health.html index 337afa96..44a9d055 100644 --- a/mcaptcha/api/v1/meta/struct.health.html +++ b/mcaptcha/api/v1/meta/struct.health.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::meta::health - Rust +health in mcaptcha::api::v1::meta - Rust -

Struct mcaptcha::api::v1::meta::health[][src]

pub struct health;

checks all components of the system

-

Trait Implementations

impl HttpServiceFactory for health[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/add/index.html b/mcaptcha/api/v1/notifications/add/index.html index 04de8b78..1df27cd8 100644 --- a/mcaptcha/api/v1/notifications/add/index.html +++ b/mcaptcha/api/v1/notifications/add/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::notifications::add - Rust +mcaptcha::api::v1::notifications::add - Rust -

Module mcaptcha::api::v1::notifications::add[][src]

Structs

+

Module mcaptcha::api::v1::notifications::add[][src]

Structs

AddNotification
add_notification

route handler that adds a notification message

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/add/struct.AddNotification.html b/mcaptcha/api/v1/notifications/add/struct.AddNotification.html index 0c0d0cdd..354c8a28 100644 --- a/mcaptcha/api/v1/notifications/add/struct.AddNotification.html +++ b/mcaptcha/api/v1/notifications/add/struct.AddNotification.html @@ -1,119 +1,115 @@ -mcaptcha::api::v1::notifications::add::AddNotification - Rust +AddNotification in mcaptcha::api::v1::notifications::add - Rust -

Struct mcaptcha::api::v1::notifications::add::AddNotification[][src]

pub struct AddNotification {
+

Struct mcaptcha::api::v1::notifications::add::AddNotification[][src]

pub struct AddNotification {
     pub to: String,
     pub heading: String,
     pub message: String,
 }

- Fields

to: Stringheading: Stringmessage: String

Trait Implementations

impl<'de> Deserialize<'de> for AddNotification[src]

impl Serialize for AddNotification[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/add/struct.add_notification.html b/mcaptcha/api/v1/notifications/add/struct.add_notification.html index 973a29cd..595b88b7 100644 --- a/mcaptcha/api/v1/notifications/add/struct.add_notification.html +++ b/mcaptcha/api/v1/notifications/add/struct.add_notification.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::notifications::add::add_notification - Rust +add_notification in mcaptcha::api::v1::notifications::add - Rust -

Struct mcaptcha::api::v1::notifications::add::add_notification[][src]

pub struct add_notification;

route handler that adds a notification message

-

Trait Implementations

impl HttpServiceFactory for add_notification[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/fn.services.html b/mcaptcha/api/v1/notifications/fn.services.html index 73f979f3..1abc8b7b 100644 --- a/mcaptcha/api/v1/notifications/fn.services.html +++ b/mcaptcha/api/v1/notifications/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::notifications::services - Rust +services in mcaptcha::api::v1::notifications - Rust -

Function mcaptcha::api::v1::notifications::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::notifications::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/index.html b/mcaptcha/api/v1/notifications/get/index.html index a08011f6..ecc9db8c 100644 --- a/mcaptcha/api/v1/notifications/get/index.html +++ b/mcaptcha/api/v1/notifications/get/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::notifications::get - Rust +mcaptcha::api::v1::notifications::get - Rust -

Module mcaptcha::api::v1::notifications::get[][src]

Structs

+

Module mcaptcha::api::v1::notifications::get[][src]

Structs

Notification
NotificationResp
get_notification

route handler that gets all unread notifications

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/struct.Notification.html b/mcaptcha/api/v1/notifications/get/struct.Notification.html index 6047186f..a76b5e4b 100644 --- a/mcaptcha/api/v1/notifications/get/struct.Notification.html +++ b/mcaptcha/api/v1/notifications/get/struct.Notification.html @@ -1,120 +1,116 @@ -mcaptcha::api::v1::notifications::get::Notification - Rust +Notification in mcaptcha::api::v1::notifications::get - Rust -

Struct mcaptcha::api::v1::notifications::get::Notification[][src]

pub struct Notification {
-    pub name: String,
-    pub heading: String,
-    pub message: String,
-    pub received: OffsetDateTime,
-    pub id: i32,
+

Struct mcaptcha::api::v1::notifications::get::Notification[][src]

pub struct Notification {
+    pub name: Option<String>,
+    pub heading: Option<String>,
+    pub message: Option<String>,
+    pub received: Option<OffsetDateTime>,
+    pub id: Option<i32>,
 }

- Fields

name: Stringheading: Stringmessage: Stringreceived: OffsetDateTimeid: i32

Trait Implementations

impl From<Notification> for NotificationResp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html b/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html index c6472afc..d7023b05 100644 --- a/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html +++ b/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html @@ -1,122 +1,118 @@ -mcaptcha::api::v1::notifications::get::NotificationResp - Rust +NotificationResp in mcaptcha::api::v1::notifications::get - Rust -

Struct mcaptcha::api::v1::notifications::get::NotificationResp[][src]

pub struct NotificationResp {
+

Struct mcaptcha::api::v1::notifications::get::NotificationResp[][src]

pub struct NotificationResp {
     pub name: String,
     pub heading: String,
     pub message: String,
     pub received: i64,
     pub id: i32,
 }

- Fields

name: Stringheading: Stringmessage: Stringreceived: i64id: i32

Trait Implementations

impl<'de> Deserialize<'de> for NotificationResp[src]

impl From<Notification> for NotificationResp[src]

impl Serialize for NotificationResp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/struct.get_notification.html b/mcaptcha/api/v1/notifications/get/struct.get_notification.html index f90b4e59..96a4f2c2 100644 --- a/mcaptcha/api/v1/notifications/get/struct.get_notification.html +++ b/mcaptcha/api/v1/notifications/get/struct.get_notification.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::notifications::get::get_notification - Rust +get_notification in mcaptcha::api::v1::notifications::get - Rust -

Struct mcaptcha::api::v1::notifications::get::get_notification[][src]

pub struct get_notification;

route handler that gets all unread notifications

-

Trait Implementations

impl HttpServiceFactory for get_notification[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/index.html b/mcaptcha/api/v1/notifications/index.html index 0c5a1559..9d38665f 100644 --- a/mcaptcha/api/v1/notifications/index.html +++ b/mcaptcha/api/v1/notifications/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::notifications - Rust +mcaptcha::api::v1::notifications - Rust -

Module mcaptcha::api::v1::notifications[][src]

Modules

+

Module mcaptcha::api::v1::notifications[][src]

Modules

add
get
mark_read
routes

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/mark_read/index.html b/mcaptcha/api/v1/notifications/mark_read/index.html index 046824f4..491ad24b 100644 --- a/mcaptcha/api/v1/notifications/mark_read/index.html +++ b/mcaptcha/api/v1/notifications/mark_read/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::notifications::mark_read - Rust +mcaptcha::api::v1::notifications::mark_read - Rust -

Module mcaptcha::api::v1::notifications::mark_read[][src]

Structs

+

Module mcaptcha::api::v1::notifications::mark_read[][src]

Structs

MarkReadReq
NotificationResp
mark_read

route handler that marks a notification read

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/mark_read/struct.MarkReadReq.html b/mcaptcha/api/v1/notifications/mark_read/struct.MarkReadReq.html index 8aeb6dd7..2995ac74 100644 --- a/mcaptcha/api/v1/notifications/mark_read/struct.MarkReadReq.html +++ b/mcaptcha/api/v1/notifications/mark_read/struct.MarkReadReq.html @@ -1,117 +1,113 @@ -mcaptcha::api::v1::notifications::mark_read::MarkReadReq - Rust +MarkReadReq in mcaptcha::api::v1::notifications::mark_read - Rust -

Struct mcaptcha::api::v1::notifications::mark_read::MarkReadReq[][src]

pub struct MarkReadReq {
+

Struct mcaptcha::api::v1::notifications::mark_read::MarkReadReq[][src]

pub struct MarkReadReq {
     pub id: i32,
 }

- Fields

id: i32

Trait Implementations

impl<'de> Deserialize<'de> for MarkReadReq[src]

impl Serialize for MarkReadReq[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html b/mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html index 9b423c92..d9a9469c 100644 --- a/mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html +++ b/mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html @@ -1,121 +1,117 @@ -mcaptcha::api::v1::notifications::mark_read::NotificationResp - Rust +NotificationResp in mcaptcha::api::v1::notifications::mark_read - Rust -

Struct mcaptcha::api::v1::notifications::mark_read::NotificationResp[][src]

pub struct NotificationResp {
+

Struct mcaptcha::api::v1::notifications::mark_read::NotificationResp[][src]

pub struct NotificationResp {
     pub name: String,
     pub heading: String,
     pub message: String,
     pub received: i64,
     pub id: i32,
 }

- Fields

name: Stringheading: Stringmessage: Stringreceived: i64id: i32

Trait Implementations

impl<'de> Deserialize<'de> for NotificationResp[src]

impl Serialize for NotificationResp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html b/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html index 652f2992..5ade212f 100644 --- a/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html +++ b/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::notifications::mark_read::mark_read - Rust +mark_read in mcaptcha::api::v1::notifications::mark_read - Rust -

Struct mcaptcha::api::v1::notifications::mark_read::mark_read[][src]

pub struct mark_read;

route handler that marks a notification read

-

Trait Implementations

impl HttpServiceFactory for mark_read[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/routes/index.html b/mcaptcha/api/v1/notifications/routes/index.html index b4a34870..575a7435 100644 --- a/mcaptcha/api/v1/notifications/routes/index.html +++ b/mcaptcha/api/v1/notifications/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::notifications::routes - Rust +mcaptcha::api::v1::notifications::routes - Rust -

Module mcaptcha::api::v1::notifications::routes[][src]

Structs

-
Notifications
- \ No newline at end of file +

Module mcaptcha::api::v1::notifications::routes[][src]

Structs

+
Notifications
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/routes/struct.Notifications.html b/mcaptcha/api/v1/notifications/routes/struct.Notifications.html index 29566a6b..0df5beab 100644 --- a/mcaptcha/api/v1/notifications/routes/struct.Notifications.html +++ b/mcaptcha/api/v1/notifications/routes/struct.Notifications.html @@ -1,117 +1,113 @@ -mcaptcha::api::v1::notifications::routes::Notifications - Rust +Notifications in mcaptcha::api::v1::notifications::routes - Rust -

Struct mcaptcha::api::v1::notifications::routes::Notifications[][src]

pub struct Notifications {
+

Struct mcaptcha::api::v1::notifications::routes::Notifications[][src]

pub struct Notifications {
     pub add: &'static str,
     pub mark_read: &'static str,
     pub get: &'static str,
 }

- Fields

add: &'static strmark_read: &'static strget: &'static str

Implementations

impl Notifications[src]

pub const fn new() -> Notifications[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/fn.services.html b/mcaptcha/api/v1/pow/fn.services.html index 6df516ef..7aea5e77 100644 --- a/mcaptcha/api/v1/pow/fn.services.html +++ b/mcaptcha/api/v1/pow/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::pow::services - Rust +services in mcaptcha::api::v1::pow - Rust -

Function mcaptcha::api::v1::pow::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::api::v1::pow::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html b/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html index 7407fdca..4c7b9a60 100644 --- a/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html +++ b/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::pow::get_config::init_mcaptcha - Rust +init_mcaptcha in mcaptcha::api::v1::pow::get_config - Rust -

Function mcaptcha::api::v1::pow::get_config::init_mcaptcha[][src]

async fn init_mcaptcha(data: &AppData, key: &str) -> Result<(), ServiceError>

Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.

+

Function mcaptcha::api::v1::pow::get_config::init_mcaptcha[][src]

async fn init_mcaptcha(data: &AppData, key: &str) -> Result<(), ServiceError>

Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.

This fn gets mcaptcha config from database, builds [Defense][libmcaptcha::Defense], creates [MCaptcha][libmcaptcha::MCaptcha] and adds it to [Master][libmcaptcha::Defense]

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/get_config/index.html b/mcaptcha/api/v1/pow/get_config/index.html index 9563e025..f5bd99f9 100644 --- a/mcaptcha/api/v1/pow/get_config/index.html +++ b/mcaptcha/api/v1/pow/get_config/index.html @@ -1,9 +1,9 @@ -mcaptcha::api::v1::pow::get_config - Rust +mcaptcha::api::v1::pow::get_config - Rust -

Module mcaptcha::api::v1::pow::get_config[][src]

Structs

+

Module mcaptcha::api::v1::pow::get_config[][src]

Structs

GetConfigPayload
get_config

get PoW configuration for an mcaptcha key

Functions

init_mcaptcha

Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html b/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html index 2e4d528e..dfbac552 100644 --- a/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html +++ b/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::pow::get_config::GetConfigPayload - Rust +GetConfigPayload in mcaptcha::api::v1::pow::get_config - Rust -

Struct mcaptcha::api::v1::pow::get_config::GetConfigPayload[][src]

pub struct GetConfigPayload {
+

Struct mcaptcha::api::v1::pow::get_config::GetConfigPayload[][src]

pub struct GetConfigPayload {
     pub key: String,
 }

- Fields

key: String

Trait Implementations

impl Clone for GetConfigPayload[src]

impl Debug for GetConfigPayload[src]

impl<'de> Deserialize<'de> for GetConfigPayload[src]

impl Serialize for GetConfigPayload[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/get_config/struct.get_config.html b/mcaptcha/api/v1/pow/get_config/struct.get_config.html index 9aa44c66..12906375 100644 --- a/mcaptcha/api/v1/pow/get_config/struct.get_config.html +++ b/mcaptcha/api/v1/pow/get_config/struct.get_config.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::pow::get_config::get_config - Rust +get_config in mcaptcha::api::v1::pow::get_config - Rust -

Struct mcaptcha::api::v1::pow::get_config::get_config[][src]

pub struct get_config;

get PoW configuration for an mcaptcha key

-

Trait Implementations

impl HttpServiceFactory for get_config[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/index.html b/mcaptcha/api/v1/pow/index.html index 33884a4c..767ca1f3 100644 --- a/mcaptcha/api/v1/pow/index.html +++ b/mcaptcha/api/v1/pow/index.html @@ -1,10 +1,10 @@ -mcaptcha::api::v1::pow - Rust +mcaptcha::api::v1::pow - Rust -

Module mcaptcha::api::v1::pow[][src]

Re-exports

-
pub use super::mcaptcha::duration::GetDurationResp;
pub use super::mcaptcha::levels::I32Levels;

Modules

+

Module mcaptcha::api::v1::pow[][src]

Re-exports

+
pub use super::mcaptcha::duration::GetDurationResp;
pub use super::mcaptcha::levels::I32Levels;

Modules

get_config
routes
verify_pow

PoW Verification module

verify_token

PoW success token module

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/routes/index.html b/mcaptcha/api/v1/pow/routes/index.html index d811ca17..d4396e8f 100644 --- a/mcaptcha/api/v1/pow/routes/index.html +++ b/mcaptcha/api/v1/pow/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::api::v1::pow::routes - Rust +mcaptcha::api::v1::pow::routes - Rust -

Module mcaptcha::api::v1::pow::routes[][src]

Structs

-
PoW
- \ No newline at end of file +

Module mcaptcha::api::v1::pow::routes[][src]

Structs

+
PoW
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/routes/struct.PoW.html b/mcaptcha/api/v1/pow/routes/struct.PoW.html index a5b730b9..8637f35f 100644 --- a/mcaptcha/api/v1/pow/routes/struct.PoW.html +++ b/mcaptcha/api/v1/pow/routes/struct.PoW.html @@ -1,118 +1,114 @@ -mcaptcha::api::v1::pow::routes::PoW - Rust +PoW in mcaptcha::api::v1::pow::routes - Rust -

Struct mcaptcha::api::v1::pow::routes::PoW[][src]

pub struct PoW {
+

Struct mcaptcha::api::v1::pow::routes::PoW[][src]

pub struct PoW {
     pub get_config: &'static str,
     pub verify_pow: &'static str,
     pub validate_captcha_token: &'static str,
     pub scope: &'static str,
 }

- Fields

get_config: &'static strverify_pow: &'static strvalidate_captcha_token: &'static strscope: &'static str

Implementations

impl PoW[src]

pub const fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/verify_pow/index.html b/mcaptcha/api/v1/pow/verify_pow/index.html index 8f1b6d8b..80cd4718 100644 --- a/mcaptcha/api/v1/pow/verify_pow/index.html +++ b/mcaptcha/api/v1/pow/verify_pow/index.html @@ -1,11 +1,11 @@ -mcaptcha::api::v1::pow::verify_pow - Rust +mcaptcha::api::v1::pow::verify_pow - Rust -

Module mcaptcha::api::v1::pow::verify_pow[][src]

PoW Verification module

+

Module mcaptcha::api::v1::pow::verify_pow[][src]

PoW Verification module

Structs

ValidationToken

validation token that clients receive as proof for submiting valid PoW

verify_pow

route handler that verifies PoW and issues a solution token if verification is successful

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html b/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html index 95f612e3..df6be487 100644 --- a/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html +++ b/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html @@ -1,126 +1,122 @@ -mcaptcha::api::v1::pow::verify_pow::ValidationToken - Rust +ValidationToken in mcaptcha::api::v1::pow::verify_pow - Rust -

Struct mcaptcha::api::v1::pow::verify_pow::ValidationToken[][src]

pub struct ValidationToken {
+

Struct mcaptcha::api::v1::pow::verify_pow::ValidationToken[][src]

pub struct ValidationToken {
     pub token: String,
 }

validation token that clients receive as proof for submiting valid PoW

- Fields

token: String

Trait Implementations

impl Clone for ValidationToken[src]

impl Debug for ValidationToken[src]

impl<'de> Deserialize<'de> for ValidationToken[src]

impl Serialize for ValidationToken[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html b/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html index 2e91d446..2f33f31b 100644 --- a/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html +++ b/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html @@ -1,114 +1,110 @@ -mcaptcha::api::v1::pow::verify_pow::verify_pow - Rust +verify_pow in mcaptcha::api::v1::pow::verify_pow - Rust -

Struct mcaptcha::api::v1::pow::verify_pow::verify_pow[][src]

pub struct verify_pow;

route handler that verifies PoW and issues a solution token +

Struct mcaptcha::api::v1::pow::verify_pow::verify_pow[][src]

pub struct verify_pow;

route handler that verifies PoW and issues a solution token if verification is successful

-

Trait Implementations

impl HttpServiceFactory for verify_pow[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Trait Implementations

impl HttpServiceFactory for verify_pow[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/verify_token/index.html b/mcaptcha/api/v1/pow/verify_token/index.html index 48d42365..8ab1b72b 100644 --- a/mcaptcha/api/v1/pow/verify_token/index.html +++ b/mcaptcha/api/v1/pow/verify_token/index.html @@ -1,8 +1,8 @@ -mcaptcha::api::v1::pow::verify_token - Rust +mcaptcha::api::v1::pow::verify_token - Rust -

Module mcaptcha::api::v1::pow::verify_token[][src]

PoW success token module

+

Module mcaptcha::api::v1::pow::verify_token[][src]

PoW success token module

Structs

CaptchaValidateResp
validate_captcha_token

route hander that validates a PoW solution token

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html b/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html index 8d3578ef..58abe7b7 100644 --- a/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html +++ b/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html @@ -1,124 +1,120 @@ -mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp - Rust +CaptchaValidateResp in mcaptcha::api::v1::pow::verify_token - Rust -

Struct mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp[][src]

pub struct CaptchaValidateResp {
+

Struct mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp[][src]

pub struct CaptchaValidateResp {
     pub valid: bool,
 }

- Fields

valid: bool

Trait Implementations

impl Clone for CaptchaValidateResp[src]

impl Debug for CaptchaValidateResp[src]

impl<'de> Deserialize<'de> for CaptchaValidateResp[src]

impl Serialize for CaptchaValidateResp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html b/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html index f0f45870..197e2fe3 100644 --- a/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html +++ b/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html @@ -1,113 +1,109 @@ -mcaptcha::api::v1::pow::verify_token::validate_captcha_token - Rust +validate_captcha_token in mcaptcha::api::v1::pow::verify_token - Rust -

Struct mcaptcha::api::v1::pow::verify_token::validate_captcha_token[][src]

pub struct validate_captcha_token;

route hander that validates a PoW solution token

-

Trait Implementations

impl HttpServiceFactory for validate_captcha_token[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/api/v1/routes/constant.ROUTES.html b/mcaptcha/api/v1/routes/constant.ROUTES.html index b4230633..c34a007f 100644 --- a/mcaptcha/api/v1/routes/constant.ROUTES.html +++ b/mcaptcha/api/v1/routes/constant.ROUTES.html @@ -1,5 +1,5 @@ -mcaptcha::api::v1::routes::ROUTES - Rust +ROUTES in mcaptcha::api::v1::routes - Rust -

Constant mcaptcha::api::v1::routes::ROUTES[][src]

pub const ROUTES: Routes;
- \ No newline at end of file +

Constant mcaptcha::api::v1::routes::ROUTES[][src]

pub const ROUTES: Routes;
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/routes/index.html b/mcaptcha/api/v1/routes/index.html index 1594ccc8..d51ed1c4 100644 --- a/mcaptcha/api/v1/routes/index.html +++ b/mcaptcha/api/v1/routes/index.html @@ -1,7 +1,7 @@ -mcaptcha::api::v1::routes - Rust +mcaptcha::api::v1::routes - Rust -

Module mcaptcha::api::v1::routes[][src]

Structs

+

Module mcaptcha::api::v1::routes[][src]

Structs

Routes

Constants

-
ROUTES
- \ No newline at end of file +
ROUTES
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/routes/struct.Routes.html b/mcaptcha/api/v1/routes/struct.Routes.html index 1265a77d..41957e50 100644 --- a/mcaptcha/api/v1/routes/struct.Routes.html +++ b/mcaptcha/api/v1/routes/struct.Routes.html @@ -1,122 +1,118 @@ -mcaptcha::api::v1::routes::Routes - Rust +Routes in mcaptcha::api::v1::routes - Rust -

Struct mcaptcha::api::v1::routes::Routes[][src]

pub struct Routes {
-    pub auth: Auth,
-    pub account: Account,
-    pub levels: Levels,
-    pub mcaptcha: MCaptcha,
-    pub duration: Duration,
-    pub meta: Meta,
-    pub pow: PoW,
-    pub notifications: Notifications,
+

Struct mcaptcha::api::v1::routes::Routes[][src]

pub struct Routes {
+    pub auth: Auth,
+    pub account: Account,
+    pub levels: Levels,
+    pub mcaptcha: MCaptcha,
+    pub duration: Duration,
+    pub meta: Meta,
+    pub pow: PoW,
+    pub notifications: Notifications,
 }

- Fields

auth: Authaccount: Accountlevels: Levelsmcaptcha: MCaptchaduration: Durationmeta: Metapow: PoWnotifications: Notifications

Implementations

impl Routes[src]

const fn new() -> Routes[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/constant.CACHE_AGE.html b/mcaptcha/constant.CACHE_AGE.html index 1645f095..92a490d3 100644 --- a/mcaptcha/constant.CACHE_AGE.html +++ b/mcaptcha/constant.CACHE_AGE.html @@ -1,5 +1,5 @@ -mcaptcha::CACHE_AGE - Rust +CACHE_AGE in mcaptcha - Rust -

Constant mcaptcha::CACHE_AGE[][src]

pub const CACHE_AGE: u32 = 604800;
- \ No newline at end of file +

Constant mcaptcha::CACHE_AGE[][src]

pub const CACHE_AGE: u32 = 604800;
+ \ No newline at end of file diff --git a/mcaptcha/constant.DOCS.html b/mcaptcha/constant.DOCS.html index 5590982f..2edfd857 100644 --- a/mcaptcha/constant.DOCS.html +++ b/mcaptcha/constant.DOCS.html @@ -1,5 +1,5 @@ -mcaptcha::DOCS - Rust +DOCS in mcaptcha - Rust -

Constant mcaptcha::DOCS[][src]

pub const DOCS: Docs;
- \ No newline at end of file +

Constant mcaptcha::DOCS[][src]

pub const DOCS: Docs;
+ \ No newline at end of file diff --git a/mcaptcha/constant.PAGES.html b/mcaptcha/constant.PAGES.html index 360190cb..b72793e2 100644 --- a/mcaptcha/constant.PAGES.html +++ b/mcaptcha/constant.PAGES.html @@ -1,5 +1,5 @@ -mcaptcha::PAGES - Rust +PAGES in mcaptcha - Rust -

Constant mcaptcha::PAGES[][src]

pub const PAGES: Routes;
- \ No newline at end of file +

Constant mcaptcha::PAGES[][src]

pub const PAGES: Routes;
+ \ No newline at end of file diff --git a/mcaptcha/constant.V1_API_ROUTES.html b/mcaptcha/constant.V1_API_ROUTES.html index 6ec0027a..7618475c 100644 --- a/mcaptcha/constant.V1_API_ROUTES.html +++ b/mcaptcha/constant.V1_API_ROUTES.html @@ -1,5 +1,5 @@ -mcaptcha::V1_API_ROUTES - Rust +V1_API_ROUTES in mcaptcha - Rust -

Constant mcaptcha::V1_API_ROUTES[][src]

pub const V1_API_ROUTES: Routes;
- \ No newline at end of file +

Constant mcaptcha::V1_API_ROUTES[][src]

pub const V1_API_ROUTES: Routes;
+ \ No newline at end of file diff --git a/mcaptcha/constant.WIDGET_ROUTES.html b/mcaptcha/constant.WIDGET_ROUTES.html index 2716349c..2c10d776 100644 --- a/mcaptcha/constant.WIDGET_ROUTES.html +++ b/mcaptcha/constant.WIDGET_ROUTES.html @@ -1,5 +1,5 @@ -mcaptcha::WIDGET_ROUTES - Rust +WIDGET_ROUTES in mcaptcha - Rust -

Constant mcaptcha::WIDGET_ROUTES[][src]

pub const WIDGET_ROUTES: Widget;
- \ No newline at end of file +

Constant mcaptcha::WIDGET_ROUTES[][src]

pub const WIDGET_ROUTES: Widget;
+ \ No newline at end of file diff --git a/mcaptcha/data/enum.SystemGroup.html b/mcaptcha/data/enum.SystemGroup.html index 88c18701..c46d2db5 100644 --- a/mcaptcha/data/enum.SystemGroup.html +++ b/mcaptcha/data/enum.SystemGroup.html @@ -1,123 +1,119 @@ -mcaptcha::data::SystemGroup - Rust +SystemGroup in mcaptcha::data - Rust -

Enum mcaptcha::data::SystemGroup[][src]

pub enum SystemGroup {
+

Enum mcaptcha::data::SystemGroup[][src]

pub enum SystemGroup {
     Embedded(System<HashCache, EmbeddedMaster>),
     Redis(System<RedisCache, RedisMaster>),
 }

Represents mCaptcha cache and master system. -When Redis is configured, SystemGroup::Redis is used and -in its absense, SystemGroup::Embedded is used

+When Redis is configured, SystemGroup::Redis is used and +in its absense, SystemGroup::Embedded is used

Variants

-
Embedded(System<HashCache, EmbeddedMaster>)
Redis(System<RedisCache, RedisMaster>)

Implementations

impl SystemGroup[src]

pub async fn get_pow(&self, id: String) -> Option<PoWConfig>[src]

utility function to get difficulty factor of site id and cache it

-

pub async fn verify_pow(&self, work: Work) -> CaptchaResult<String>[src]

utility function to verify [Work]

-

pub async fn validate_verification_tokens(
    &self,
    msg: VerifyCaptchaResult
) -> CaptchaResult<bool>
[src]

utility function to validate verification tokens

-

fn new_system<A: Save, B: MasterTrait>(m: Addr<B>, c: Addr<A>) -> System<A, B>[src]

async fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/data/index.html b/mcaptcha/data/index.html index f1bc18d8..af7f7986 100644 --- a/mcaptcha/data/index.html +++ b/mcaptcha/data/index.html @@ -1,14 +1,14 @@ -mcaptcha::data - Rust +mcaptcha::data - Rust -

Module mcaptcha::data[][src]

App data: redis cache, database connections, etc.

+

Module mcaptcha::data[][src]

App data: redis cache, database connections, etc.

Structs

Data

App data

Enums

SystemGroup

Represents mCaptcha cache and master system. -When Redis is configured, SystemGroup::Redis is used and -in its absense, SystemGroup::Embedded is used

+When Redis is configured, SystemGroup::Redis is used and +in its absense, SystemGroup::Embedded is used

Type Definitions

Mailer

Mailer data type AsyncSmtpTransport

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/data/struct.Data.html b/mcaptcha/data/struct.Data.html index c4a89783..f6648762 100644 --- a/mcaptcha/data/struct.Data.html +++ b/mcaptcha/data/struct.Data.html @@ -1,124 +1,120 @@ -mcaptcha::data::Data - Rust +Data in mcaptcha::data - Rust -

Struct mcaptcha::data::Data[][src]

pub struct Data {
+

Struct mcaptcha::data::Data[][src]

pub struct Data {
     pub db: PgPool,
     pub creds: Config,
-    pub captcha: SystemGroup,
+    pub captcha: SystemGroup,
     pub mailer: Option<AsyncSmtpTransport<Tokio1Executor>>,
 }

App data

Fields

db: PgPool

databse pool

creds: Config

credential management configuration

-
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

+
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

mailer: Option<AsyncSmtpTransport<Tokio1Executor>>

email client

-

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

-

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

+

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

impl !RefUnwindSafe for Data

impl Send for Data

impl Sync for Data

impl Unpin for Data

impl !UnwindSafe for Data

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/data/type.Mailer.html b/mcaptcha/data/type.Mailer.html index 63453d31..a16b4ab7 100644 --- a/mcaptcha/data/type.Mailer.html +++ b/mcaptcha/data/type.Mailer.html @@ -1,6 +1,6 @@ -mcaptcha::data::Mailer - Rust +Mailer in mcaptcha::data - Rust -

Type Definition mcaptcha::data::Mailer[][src]

type Mailer = AsyncSmtpTransport<Tokio1Executor>;

Mailer data type AsyncSmtpTransport

-
- \ No newline at end of file +

Type Definition mcaptcha::data::Mailer[][src]

type Mailer = AsyncSmtpTransport<Tokio1Executor>;

Mailer data type AsyncSmtpTransport

+
+ \ No newline at end of file diff --git a/mcaptcha/docs/constant.DOCS.html b/mcaptcha/docs/constant.DOCS.html index bb09b633..0d6bff61 100644 --- a/mcaptcha/docs/constant.DOCS.html +++ b/mcaptcha/docs/constant.DOCS.html @@ -1,5 +1,5 @@ -mcaptcha::docs::DOCS - Rust +DOCS in mcaptcha::docs - Rust -

Constant mcaptcha::docs::DOCS[][src]

pub const DOCS: Docs;
- \ No newline at end of file +

Constant mcaptcha::docs::DOCS[][src]

pub const DOCS: Docs;
+ \ No newline at end of file diff --git a/mcaptcha/docs/fn.dist.html b/mcaptcha/docs/fn.dist.html index 2b24f7ad..67f39b7b 100644 --- a/mcaptcha/docs/fn.dist.html +++ b/mcaptcha/docs/fn.dist.html @@ -1,5 +1,5 @@ -mcaptcha::docs::dist - Rust +dist in mcaptcha::docs - Rust -

Function mcaptcha::docs::dist[][src]

async fn dist(path: Path<String>) -> impl Responder
- \ No newline at end of file +

Function mcaptcha::docs::dist[][src]

async fn dist(path: Path<String>) -> impl Responder
+ \ No newline at end of file diff --git a/mcaptcha/docs/fn.handle_embedded_file.html b/mcaptcha/docs/fn.handle_embedded_file.html index a8180e5b..960198f0 100644 --- a/mcaptcha/docs/fn.handle_embedded_file.html +++ b/mcaptcha/docs/fn.handle_embedded_file.html @@ -1,5 +1,5 @@ -mcaptcha::docs::handle_embedded_file - Rust +handle_embedded_file in mcaptcha::docs - Rust -

Function mcaptcha::docs::handle_embedded_file[][src]

pub fn handle_embedded_file(path: &str) -> HttpResponse
- \ No newline at end of file +

Function mcaptcha::docs::handle_embedded_file[][src]

pub fn handle_embedded_file(path: &str) -> HttpResponse
+ \ No newline at end of file diff --git a/mcaptcha/docs/fn.index.html b/mcaptcha/docs/fn.index.html index e509999c..69d5522b 100644 --- a/mcaptcha/docs/fn.index.html +++ b/mcaptcha/docs/fn.index.html @@ -1,5 +1,5 @@ -mcaptcha::docs::index - Rust +index in mcaptcha::docs - Rust -

Function mcaptcha::docs::index[][src]

async fn index() -> HttpResponse
- \ No newline at end of file +

Function mcaptcha::docs::index[][src]

async fn index() -> HttpResponse
+ \ No newline at end of file diff --git a/mcaptcha/docs/fn.services.html b/mcaptcha/docs/fn.services.html index 8d454516..42bc4ff0 100644 --- a/mcaptcha/docs/fn.services.html +++ b/mcaptcha/docs/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::docs::services - Rust +services in mcaptcha::docs - Rust -

Function mcaptcha::docs::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::docs::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/docs/fn.spec.html b/mcaptcha/docs/fn.spec.html index f4962448..c3cf1019 100644 --- a/mcaptcha/docs/fn.spec.html +++ b/mcaptcha/docs/fn.spec.html @@ -1,5 +1,5 @@ -mcaptcha::docs::spec - Rust +spec in mcaptcha::docs - Rust -

Function mcaptcha::docs::spec[][src]

async fn spec() -> HttpResponse
- \ No newline at end of file +

Function mcaptcha::docs::spec[][src]

async fn spec() -> HttpResponse
+ \ No newline at end of file diff --git a/mcaptcha/docs/index.html b/mcaptcha/docs/index.html index 852cb5b3..b61760a3 100644 --- a/mcaptcha/docs/index.html +++ b/mcaptcha/docs/index.html @@ -1,9 +1,9 @@ -mcaptcha::docs - Rust +mcaptcha::docs - Rust -

Module mcaptcha::docs[][src]

Modules

+

Module mcaptcha::docs[][src]

Modules

routes

Structs

Asset

Constants

DOCS

Functions

-
dist
handle_embedded_file
index
services
spec
- \ No newline at end of file +
dist
handle_embedded_file
index
services
spec
+ \ No newline at end of file diff --git a/mcaptcha/docs/routes/index.html b/mcaptcha/docs/routes/index.html index caaf8bb4..380e4891 100644 --- a/mcaptcha/docs/routes/index.html +++ b/mcaptcha/docs/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::docs::routes - Rust +mcaptcha::docs::routes - Rust -

Module mcaptcha::docs::routes[][src]

Structs

-
Docs
- \ No newline at end of file +

Module mcaptcha::docs::routes[][src]

Structs

+
Docs
+ \ No newline at end of file diff --git a/mcaptcha/docs/routes/struct.Docs.html b/mcaptcha/docs/routes/struct.Docs.html index 747ac051..698ff2dc 100644 --- a/mcaptcha/docs/routes/struct.Docs.html +++ b/mcaptcha/docs/routes/struct.Docs.html @@ -1,117 +1,113 @@ -mcaptcha::docs::routes::Docs - Rust +Docs in mcaptcha::docs::routes - Rust -

Struct mcaptcha::docs::routes::Docs[][src]

pub struct Docs {
+

Struct mcaptcha::docs::routes::Docs[][src]

pub struct Docs {
     pub home: &'static str,
     pub spec: &'static str,
     pub assets: &'static str,
 }

- Fields

home: &'static strspec: &'static strassets: &'static str

Implementations

impl Docs[src]

pub const fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/docs/struct.Asset.html b/mcaptcha/docs/struct.Asset.html index 3c0f306f..f4d9a826 100644 --- a/mcaptcha/docs/struct.Asset.html +++ b/mcaptcha/docs/struct.Asset.html @@ -1,114 +1,110 @@ -mcaptcha::docs::Asset - Rust +Asset in mcaptcha::docs - Rust -

Struct mcaptcha::docs::Asset[][src]

struct Asset;

Implementations

impl Asset[src]

pub fn get(file_path: &str) -> Option<Cow<'static, [u8]>>[src]

pub fn iter() -> impl Iterator<Item = Cow<'static, str>>[src]

Trait Implementations

impl RustEmbed for Asset[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/email/index.html b/mcaptcha/email/index.html new file mode 100644 index 00000000..9d13f470 --- /dev/null +++ b/mcaptcha/email/index.html @@ -0,0 +1,7 @@ +mcaptcha::email - Rust + +

Module mcaptcha::email[][src]

Modules

+
verification

Email operations: verification, notification, etc

+
+ \ No newline at end of file diff --git a/mcaptcha/email/sidebar-items.js b/mcaptcha/email/sidebar-items.js new file mode 100644 index 00000000..36d3b81e --- /dev/null +++ b/mcaptcha/email/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"mod":[["verification","Email operations: verification, notification, etc"]]}); \ No newline at end of file diff --git a/mcaptcha/email/verification/constant.PAGE.html b/mcaptcha/email/verification/constant.PAGE.html new file mode 100644 index 00000000..b76afc00 --- /dev/null +++ b/mcaptcha/email/verification/constant.PAGE.html @@ -0,0 +1,5 @@ +PAGE in mcaptcha::email::verification - Rust + +

Constant mcaptcha::email::verification::PAGE[][src]

const PAGE: &str = "Login";
+ \ No newline at end of file diff --git a/mcaptcha/email/verification/fn.verification.html b/mcaptcha/email/verification/fn.verification.html new file mode 100644 index 00000000..f8089256 --- /dev/null +++ b/mcaptcha/email/verification/fn.verification.html @@ -0,0 +1,5 @@ +verification in mcaptcha::email::verification - Rust + +

Function mcaptcha::email::verification::verification[][src]

async fn verification(
    data: &Data,
    to: &str,
    verification_link: &str
) -> Result<(), ServiceError>
+ \ No newline at end of file diff --git a/mcaptcha/email/verification/index.html b/mcaptcha/email/verification/index.html new file mode 100644 index 00000000..fa4feaee --- /dev/null +++ b/mcaptcha/email/verification/index.html @@ -0,0 +1,9 @@ +mcaptcha::email::verification - Rust + +

Module mcaptcha::email::verification[][src]

Email operations: verification, notification, etc

+

Structs

+
IndexPage

Constants

+
PAGE

Functions

+
verification
+ \ No newline at end of file diff --git a/mcaptcha/email/verification/sidebar-items.js b/mcaptcha/email/verification/sidebar-items.js new file mode 100644 index 00000000..c94d79ed --- /dev/null +++ b/mcaptcha/email/verification/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"constant":[["PAGE",""]],"fn":[["verification",""]],"struct":[["IndexPage",""]]}); \ No newline at end of file diff --git a/mcaptcha/email/verification/struct.IndexPage.html b/mcaptcha/email/verification/struct.IndexPage.html new file mode 100644 index 00000000..dab6a5e4 --- /dev/null +++ b/mcaptcha/email/verification/struct.IndexPage.html @@ -0,0 +1,119 @@ +IndexPage in mcaptcha::email::verification - Rust + +

Struct mcaptcha::email::verification::IndexPage[][src]

struct IndexPage<'a> {
+    verification_link: &'a str,
+}

+ Fields

verification_link: &'a str

Implementations

impl<'a> IndexPage<'a>[src]

fn new(verification_link: &'a str) -> Self[src]

Trait Implementations

impl<'a> Clone for IndexPage<'a>[src]

impl<'a> TemplateOnce for IndexPage<'a>[src]

impl<'a> Sealed for IndexPage<'a>[src]

Auto Trait Implementations

impl<'a> RefUnwindSafe for IndexPage<'a>

impl<'a> Send for IndexPage<'a>

impl<'a> Sync for IndexPage<'a>

impl<'a> Unpin for IndexPage<'a>

impl<'a> UnwindSafe for IndexPage<'a>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

+

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/errors/enum.PageError.html b/mcaptcha/errors/enum.PageError.html index 698bdd71..53988d70 100644 --- a/mcaptcha/errors/enum.PageError.html +++ b/mcaptcha/errors/enum.PageError.html @@ -1,131 +1,127 @@ -mcaptcha::errors::PageError - Rust +PageError in mcaptcha::errors - Rust -

Enum mcaptcha::errors::PageError[][src]

pub enum PageError {
+

Enum mcaptcha::errors::PageError[][src]

pub enum PageError {
     InternalServerError,
-    ServiceError(ServiceError),
+    ServiceError(ServiceError),
 }

Variants

-
InternalServerError
ServiceError(ServiceError)

Trait Implementations

impl Debug for PageError[src]

impl Display for PageError[src]

impl Error for PageError[src]

impl From<Error> for PageError[src]

impl From<ServiceError> for PageError[src]

impl PartialEq<PageError> for PageError[src]

- \ No newline at end of file +

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/errors/enum.ServiceError.html b/mcaptcha/errors/enum.ServiceError.html index ca270d29..3868720e 100644 --- a/mcaptcha/errors/enum.ServiceError.html +++ b/mcaptcha/errors/enum.ServiceError.html @@ -1,8 +1,8 @@ -mcaptcha::errors::ServiceError - Rust +ServiceError in mcaptcha::errors - Rust -

Enum mcaptcha::errors::ServiceError[][src]

Variants

InternalServerError
ClosedForRegistration
NotAnEmail
NotAUrl
WrongPassword
UsernameNotFound
AccountNotFound
ProfainityError

when the value passed contains profainity

BlacklistError

when the value passed contains blacklisted words @@ -29,132 +30,130 @@ in UsernameCaseMapped profile

PasswordTooShort
PasswordTooLong
PasswordsDontMatch
UsernameTaken

when the a username is already taken

EmailTaken

email is already taken

+
UnableToSendEmail(SmtpErrorWrapper)

Unable to send email

TokenNotFound

when the a token name is already taken token not found

-
CaptchaError(CaptchaError)

Trait Implementations

impl Debug for ServiceError[src]

impl Display for ServiceError[src]

impl Error for ServiceError[src]

impl From<CaptchaError> for ServiceError[src]

impl From<CredsError> for ServiceError[src]

impl From<Error> for ServiceError[src]

impl From<ParseError> for ServiceError[src]

impl From<ServiceError> for PageError[src]

impl From<ValidationErrors> for ServiceError[src]

impl PartialEq<ServiceError> for ServiceError[src]

CaptchaError(CaptchaError)

Trait Implementations

impl Debug for ServiceError[src]

impl Display for ServiceError[src]

impl Error for ServiceError[src]

impl From<CaptchaError> for ServiceError[src]

impl From<CredsError> for ServiceError[src]

impl From<Error> for ServiceError[src]

impl From<Error> for ServiceError[src]

impl From<ParseError> for ServiceError[src]

impl From<ServiceError> for PageError[src]

impl From<ValidationErrors> for ServiceError[src]

impl PartialEq<ServiceError> for ServiceError[src]

impl ResponseError for ServiceError[src]

impl StructuralPartialEq for ServiceError[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl ResponseError for ServiceError[src]

impl StructuralPartialEq for ServiceError[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/errors/index.html b/mcaptcha/errors/index.html index 57430b9d..4cd33a22 100644 --- a/mcaptcha/errors/index.html +++ b/mcaptcha/errors/index.html @@ -1,8 +1,8 @@ -mcaptcha::errors - Rust +mcaptcha::errors - Rust -

Module mcaptcha::errors[][src]

Structs

-
ErrorToResponse

Enums

+

Module mcaptcha::errors[][src]

Structs

+
ErrorToResponse
SmtpErrorWrapper

Enums

PageError
ServiceError

Type Definitions

-
PageResult
ServiceResult
- \ No newline at end of file +
PageResult
ServiceResult
+ \ No newline at end of file diff --git a/mcaptcha/errors/sidebar-items.js b/mcaptcha/errors/sidebar-items.js index daa04101..8213d9cc 100644 --- a/mcaptcha/errors/sidebar-items.js +++ b/mcaptcha/errors/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["PageError",""],["ServiceError",""]],"struct":[["ErrorToResponse",""]],"type":[["PageResult",""],["ServiceResult",""]]}); \ No newline at end of file +initSidebarItems({"enum":[["PageError",""],["ServiceError",""]],"struct":[["ErrorToResponse",""],["SmtpErrorWrapper",""]],"type":[["PageResult",""],["ServiceResult",""]]}); \ No newline at end of file diff --git a/mcaptcha/errors/struct.ErrorToResponse.html b/mcaptcha/errors/struct.ErrorToResponse.html index e6675d27..7cfb7250 100644 --- a/mcaptcha/errors/struct.ErrorToResponse.html +++ b/mcaptcha/errors/struct.ErrorToResponse.html @@ -1,117 +1,113 @@ -mcaptcha::errors::ErrorToResponse - Rust +ErrorToResponse in mcaptcha::errors - Rust -

Struct mcaptcha::errors::ErrorToResponse[][src]

pub struct ErrorToResponse {
+

Struct mcaptcha::errors::ErrorToResponse[][src]

pub struct ErrorToResponse {
     pub error: String,
 }

- Fields

error: String

Trait Implementations

impl<'de> Deserialize<'de> for ErrorToResponse[src]

impl Serialize for ErrorToResponse[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/errors/struct.SmtpErrorWrapper.html b/mcaptcha/errors/struct.SmtpErrorWrapper.html new file mode 100644 index 00000000..c14933bb --- /dev/null +++ b/mcaptcha/errors/struct.SmtpErrorWrapper.html @@ -0,0 +1,118 @@ +SmtpErrorWrapper in mcaptcha::errors - Rust + +

Struct mcaptcha::errors::SmtpErrorWrapper[][src]

pub struct SmtpErrorWrapper(SmtpError);

Trait Implementations

impl Debug for SmtpErrorWrapper[src]

impl Display for SmtpErrorWrapper[src]

impl Error for SmtpErrorWrapper[src]

impl PartialEq<SmtpErrorWrapper> for SmtpErrorWrapper[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/errors/type.PageResult.html b/mcaptcha/errors/type.PageResult.html index 02b154ab..b55ba3a6 100644 --- a/mcaptcha/errors/type.PageResult.html +++ b/mcaptcha/errors/type.PageResult.html @@ -1,5 +1,5 @@ -mcaptcha::errors::PageResult - Rust +PageResult in mcaptcha::errors - Rust -

Type Definition mcaptcha::errors::PageResult[][src]

type PageResult<V> = Result<V, PageError>;
- \ No newline at end of file +

Type Definition mcaptcha::errors::PageResult[][src]

type PageResult<V> = Result<V, PageError>;
+ \ No newline at end of file diff --git a/mcaptcha/errors/type.ServiceResult.html b/mcaptcha/errors/type.ServiceResult.html index d2ab9804..f61600d9 100644 --- a/mcaptcha/errors/type.ServiceResult.html +++ b/mcaptcha/errors/type.ServiceResult.html @@ -1,5 +1,5 @@ -mcaptcha::errors::ServiceResult - Rust +ServiceResult in mcaptcha::errors - Rust -

Type Definition mcaptcha::errors::ServiceResult[][src]

type ServiceResult<V> = Result<V, ServiceError>;
- \ No newline at end of file +

Type Definition mcaptcha::errors::ServiceResult[][src]

type ServiceResult<V> = Result<V, ServiceError>;
+ \ No newline at end of file diff --git a/mcaptcha/fn.get_identity_service.html b/mcaptcha/fn.get_identity_service.html index 7bec95a6..ee415244 100644 --- a/mcaptcha/fn.get_identity_service.html +++ b/mcaptcha/fn.get_identity_service.html @@ -1,5 +1,5 @@ -mcaptcha::get_identity_service - Rust +get_identity_service in mcaptcha - Rust -

Function mcaptcha::get_identity_service[][src]

pub fn get_identity_service() -> IdentityService<CookieIdentityPolicy>
- \ No newline at end of file +

Function mcaptcha::get_identity_service[][src]

pub fn get_identity_service() -> IdentityService<CookieIdentityPolicy>
+ \ No newline at end of file diff --git a/mcaptcha/fn.get_json_err.html b/mcaptcha/fn.get_json_err.html index 2ca2fe6a..3a306444 100644 --- a/mcaptcha/fn.get_json_err.html +++ b/mcaptcha/fn.get_json_err.html @@ -1,5 +1,5 @@ -mcaptcha::get_json_err - Rust +get_json_err in mcaptcha - Rust -

Function mcaptcha::get_json_err[][src]

pub fn get_json_err() -> JsonConfig
- \ No newline at end of file +

Function mcaptcha::get_json_err[][src]

pub fn get_json_err() -> JsonConfig
+ \ No newline at end of file diff --git a/mcaptcha/fn.main.html b/mcaptcha/fn.main.html index b212ab6c..7543d682 100644 --- a/mcaptcha/fn.main.html +++ b/mcaptcha/fn.main.html @@ -1,5 +1,5 @@ -mcaptcha::main - Rust +main in mcaptcha - Rust -

Function mcaptcha::main[][src]

pub(crate) fn main() -> Result<()>
- \ No newline at end of file +

Function mcaptcha::main[][src]

pub(crate) fn main() -> Result<()>
+ \ No newline at end of file diff --git a/mcaptcha/index.html b/mcaptcha/index.html index 371d0e47..506bd486 100644 --- a/mcaptcha/index.html +++ b/mcaptcha/index.html @@ -1,10 +1,10 @@ -mcaptcha - Rust +mcaptcha - Rust -

Crate mcaptcha[][src]

Modules

+

Crate mcaptcha[][src]

Modules

api
data

App data: redis cache, database connections, etc.

-
docs
errors
middleware
pages
routes
settings
static_assets
stats
widget

Macros

-
define_resource

Defines resoures for Methods

+
docs
email
errors
middleware
pages
routes
settings
static_assets
stats
widget

Macros

+
define_resource

Defines resoures for Methods

Structs

CSS
CheckLogin
Data

App data

FILES
JS
MOBILE_CSS
SETTINGS
SOURCE_FILES_OF_INSTANCE

points to source files matching build commit

@@ -12,5 +12,5 @@
CACHE_AGE
DOCS
PAGES
V1_API_ROUTES
WIDGET_ROUTES

Statics

GIT_COMMIT_HASH
OPEN_API_DOC
PKG_DESCRIPTION
PKG_HOMEPAGE
PKG_NAME
VERSION

Functions

get_identity_service
get_json_err
main

Type Definitions

-
AppData
- \ No newline at end of file +
AppData
+ \ No newline at end of file diff --git a/mcaptcha/macro.define_resource.html b/mcaptcha/macro.define_resource.html index 4b37eaaa..c9d58b46 100644 --- a/mcaptcha/macro.define_resource.html +++ b/mcaptcha/macro.define_resource.html @@ -1,13 +1,13 @@ -mcaptcha::define_resource - Rust +define_resource in mcaptcha - Rust -

Macro mcaptcha::define_resource[][src]

-macro_rules! define_resource {
-    ($cfg:expr, $path:expr, Methods::Get, $to:expr) => { ... };
-    ($cfg:expr, $path:expr, Methods::Post, $to:expr) => { ... };
-    ($cfg:expr, $path:expr, Methods::ProtectPost, $to:expr) => { ... };
-    ($cfg:expr, $path:expr, Methods::ProtectGet, $to:expr) => { ... };
+

Macro mcaptcha::define_resource[][src]

+macro_rules! define_resource {
+    ($cfg:expr, $path:expr, Methods::Get, $to:expr) => { ... };
+    ($cfg:expr, $path:expr, Methods::Post, $to:expr) => { ... };
+    ($cfg:expr, $path:expr, Methods::ProtectPost, $to:expr) => { ... };
+    ($cfg:expr, $path:expr, Methods::ProtectGet, $to:expr) => { ... };
 }
-

Defines resoures for Methods

-
- \ No newline at end of file +

Defines resoures for Methods

+
+ \ No newline at end of file diff --git a/mcaptcha/middleware/auth/index.html b/mcaptcha/middleware/auth/index.html index 84de3417..0c00e346 100644 --- a/mcaptcha/middleware/auth/index.html +++ b/mcaptcha/middleware/auth/index.html @@ -1,6 +1,6 @@ -mcaptcha::middleware::auth - Rust +mcaptcha::middleware::auth - Rust -

Module mcaptcha::middleware::auth[][src]

Structs

-
CheckLogin
CheckLoginMiddleware
- \ No newline at end of file +

Module mcaptcha::middleware::auth[][src]

Structs

+
CheckLogin
CheckLoginMiddleware
+ \ No newline at end of file diff --git a/mcaptcha/middleware/auth/struct.CheckLogin.html b/mcaptcha/middleware/auth/struct.CheckLogin.html index a7380c00..677dd797 100644 --- a/mcaptcha/middleware/auth/struct.CheckLogin.html +++ b/mcaptcha/middleware/auth/struct.CheckLogin.html @@ -1,121 +1,114 @@ -mcaptcha::middleware::auth::CheckLogin - Rust +CheckLogin in mcaptcha::middleware::auth - Rust -

Struct mcaptcha::middleware::auth::CheckLogin[][src]

pub struct CheckLogin;

Trait Implementations

impl<S, B> Transform<S> for CheckLogin where
    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
    S::Future: 'static, 
[src]

type Request = ServiceRequest

Requests handled by the service.

-

type Response = ServiceResponse<B>

Responses given by the service.

-

type Error = Error

Errors produced by the service.

-

type Transform = CheckLoginMiddleware<S>

The TransformService value created by this factory

-

type InitError = ()

Errors produced while building a transform service.

-

type Future = Ready<Result<Self::Transform, Self::InitError>>

The future response value.

-

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/middleware/auth/struct.CheckLoginMiddleware.html b/mcaptcha/middleware/auth/struct.CheckLoginMiddleware.html index 046f37d9..a7c61d7c 100644 --- a/mcaptcha/middleware/auth/struct.CheckLoginMiddleware.html +++ b/mcaptcha/middleware/auth/struct.CheckLoginMiddleware.html @@ -1,125 +1,121 @@ -mcaptcha::middleware::auth::CheckLoginMiddleware - Rust +CheckLoginMiddleware in mcaptcha::middleware::auth - Rust -

Struct mcaptcha::middleware::auth::CheckLoginMiddleware[][src]

pub struct CheckLoginMiddleware<S> {
+

Struct mcaptcha::middleware::auth::CheckLoginMiddleware[][src]

pub struct CheckLoginMiddleware<S> {
     service: S,
 }

- Fields

service: S

Trait Implementations

impl<S, B> Service for CheckLoginMiddleware<S> where
    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
    S::Future: 'static, 
[src]

type Request = ServiceRequest

Requests handled by the service.

-

type Response = ServiceResponse<B>

Responses given by the service.

-

type Error = Error

Errors produced by the service.

-

type Future = Either<S::Future, Ready<Result<Self::Response, Self::Error>>>

The future response value.

-

Auto Trait Implementations

impl<S> RefUnwindSafe for CheckLoginMiddleware<S> where
    S: RefUnwindSafe
[src]

impl<S> Send for CheckLoginMiddleware<S> where
    S: Send
[src]

impl<S> Sync for CheckLoginMiddleware<S> where
    S: Sync
[src]

impl<S> Unpin for CheckLoginMiddleware<S> where
    S: Unpin
[src]

impl<S> UnwindSafe for CheckLoginMiddleware<S> where
    S: UnwindSafe
[src]

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/middleware/index.html b/mcaptcha/middleware/index.html index 78da4619..186d0d5a 100644 --- a/mcaptcha/middleware/index.html +++ b/mcaptcha/middleware/index.html @@ -1,6 +1,6 @@ -mcaptcha::middleware - Rust +mcaptcha::middleware - Rust -

Module mcaptcha::middleware[][src]

Modules

-
auth
- \ No newline at end of file +

Module mcaptcha::middleware[][src]

Modules

+
auth
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/fn.services.html b/mcaptcha/pages/auth/fn.services.html index 6b4754c4..98a08b4d 100644 --- a/mcaptcha/pages/auth/fn.services.html +++ b/mcaptcha/pages/auth/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::pages::auth::services - Rust +services in mcaptcha::pages::auth - Rust -

Function mcaptcha::pages::auth::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::pages::auth::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/index.html b/mcaptcha/pages/auth/index.html index f5b19f78..61cd49db 100644 --- a/mcaptcha/pages/auth/index.html +++ b/mcaptcha/pages/auth/index.html @@ -1,7 +1,7 @@ -mcaptcha::pages::auth - Rust +mcaptcha::pages::auth - Rust -

Module mcaptcha::pages::auth[][src]

Modules

+

Module mcaptcha::pages::auth[][src]

Modules

login
register
routes

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/login/constant.PAGE.html b/mcaptcha/pages/auth/login/constant.PAGE.html index 3cb9d606..170b0fd2 100644 --- a/mcaptcha/pages/auth/login/constant.PAGE.html +++ b/mcaptcha/pages/auth/login/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::pages::auth::login::PAGE - Rust +PAGE in mcaptcha::pages::auth::login - Rust -

Constant mcaptcha::pages::auth::login::PAGE[][src]

const PAGE: &str = "Login";
- \ No newline at end of file +

Constant mcaptcha::pages::auth::login::PAGE[][src]

const PAGE: &str = "Login";
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/login/index.html b/mcaptcha/pages/auth/login/index.html index c589c118..6addaba3 100644 --- a/mcaptcha/pages/auth/login/index.html +++ b/mcaptcha/pages/auth/login/index.html @@ -1,7 +1,7 @@ -mcaptcha::pages::auth::login - Rust +mcaptcha::pages::auth::login - Rust -

Module mcaptcha::pages::auth::login[][src]

Structs

+

Module mcaptcha::pages::auth::login[][src]

Structs

INDEX
IndexPage
login

Constants

-
PAGE
- \ No newline at end of file +
PAGE
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/login/struct.INDEX.html b/mcaptcha/pages/auth/login/struct.INDEX.html index 995e8321..154e7023 100644 --- a/mcaptcha/pages/auth/login/struct.INDEX.html +++ b/mcaptcha/pages/auth/login/struct.INDEX.html @@ -1,1555 +1,161 @@ -mcaptcha::pages::auth::login::INDEX - Rust +INDEX in mcaptcha::pages::auth::login - Rust -

Struct mcaptcha::pages::auth::login::INDEX[][src]

struct INDEX {
+

Struct mcaptcha::pages::auth::login::INDEX[][src]

struct INDEX {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

+ Fields__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

Examples

Basic usage:

-let s = String::from("foo");
+let s = String::from("foo");
 
-assert_eq!("foo", s.as_str());
-

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String's capacity, in bytes.

+assert_eq!("foo", s.as_str());
+

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String’s capacity, in bytes.

Examples

Basic usage:

-let s = String::with_capacity(10);
+let s = String::with_capacity(10);
 
-assert!(s.capacity() >= 10);
-

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String's contents.

+assert!(s.capacity() >= 10);
+

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String’s contents.

The inverse of this method is from_utf8.

Examples

Basic usage:

-let s = String::from("hello");
+let s = String::from("hello");
 
-assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
-

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or +assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());

+

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

-let a = String::from("foo");
-assert_eq!(a.len(), 3);
+let a = String::from("foo");
+assert_eq!(a.len(), 3);
 
-let fancy_f = String::from("ƒoo");
-assert_eq!(fancy_f.len(), 4);
-assert_eq!(fancy_f.chars().count(), 3);
-

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

+let fancy_f = String::from("ƒoo"); +assert_eq!(fancy_f.len(), 4); +assert_eq!(fancy_f.chars().count(), 3);
+

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

Examples

Basic usage:

-let mut v = String::new();
-assert!(v.is_empty());
+let mut v = String::new();
+assert!(v.is_empty());
 
 v.push('a');
-assert!(!v.is_empty());
-

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]1.20.0[src]

Converts a mutable string slice to a mutable byte slice.

-

Safety

-

The caller must ensure that the content of the slice is valid UTF-8 -before the borrow ends and the underlying str is used.

-

Use of a str whose contents are not valid UTF-8 is undefined behavior.

-

Examples

-

Basic usage:

- -
-let mut s = String::from("Hello");
-let bytes = unsafe { s.as_bytes_mut() };
-
-assert_eq!(b"Hello", bytes);
-

Mutability:

- -
-let mut s = String::from("🗻∈🌏");
-
-unsafe {
-    let bytes = s.as_bytes_mut();
-
-    bytes[0] = 0xF0;
-    bytes[1] = 0x9F;
-    bytes[2] = 0x8D;
-    bytes[3] = 0x94;
-}
-
-assert_eq!("🍔∈🌏", s);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn as_mut_ptr(&mut self) -> *mut u81.36.0[src]

Converts a mutable string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

It is your responsibility to make sure that the string slice only gets -modified in a way that it remains valid UTF-8.

-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub fn get_mut<I>(
    &mut self,
    i: I
) -> Option<&mut <I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let mut v = String::from("hello");
-// correct length
-assert!(v.get_mut(0..5).is_some());
-// out of bounds
-assert!(v.get_mut(..42).is_none());
-assert_eq!(Some("he"), v.get_mut(0..2).map(|v| &*v));
-
-assert_eq!("hello", v);
-{
-    let s = v.get_mut(0..2);
-    let s = s.map(|s| {
-        s.make_ascii_uppercase();
-        &*s
-    });
-    assert_eq!(Some("HE"), s);
-}
-assert_eq!("HEllo", v);
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn get_unchecked_mut<I>(
    &mut self,
    i: I
) -> &mut <I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable, unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let mut v = String::from("🗻∈🌏");
-unsafe {
-    assert_eq!("🗻", v.get_unchecked_mut(0..4));
-    assert_eq!("∈", v.get_unchecked_mut(4..7));
-    assert_eq!("🌏", v.get_unchecked_mut(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub unsafe fn slice_mut_unchecked(
    &mut self,
    begin: usize,
    end: usize
) -> &mut str
1.5.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked_mut(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks. -This is generally not recommended, use with caution! For a safe -alternative see str and IndexMut.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get an immutable string slice instead, see the -slice_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)1.4.0[src]

Divide one mutable string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get immutable string slices instead, see the split_at method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let mut s = "Per Martin-Löf".to_string();
-{
-    let (first, last) = s.split_at_mut(3);
-    first.make_ascii_uppercase();
-    assert_eq!("PER", first);
-    assert_eq!(" Martin-Löf", last);
-}
-assert_eq!("PER Martin-Löf", s);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn make_ascii_uppercase(&mut self)1.23.0[src]

Converts this string to its ASCII upper case equivalent in-place.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase().

-

Examples

-
-let mut s = String::from("Grüße, Jürgen ❤");
-
-s.make_ascii_uppercase();
-
-assert_eq!("GRüßE, JüRGEN ❤", s);
-

pub fn make_ascii_lowercase(&mut self)1.23.0[src]

Converts this string to its ASCII lower case equivalent in-place.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase().

-

Examples

-
-let mut s = String::from("GRÜßE, JÜRGEN ❤");
-
-s.make_ascii_lowercase();
-
-assert_eq!("grÜße, jÜrgen ❤", s);
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for INDEX[src]

type Target = String

The resulting type after dereferencing.

-

impl LazyStatic for INDEX[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

+

Trait Implementations

impl Deref for INDEX[src]

type Target = String

The resulting type after dereferencing.

+

impl LazyStatic for INDEX[src]

Auto Trait Implementations

impl RefUnwindSafe for INDEX

impl Send for INDEX

impl Sync for INDEX

impl Unpin for INDEX

impl UnwindSafe for INDEX

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/login/struct.IndexPage.html b/mcaptcha/pages/auth/login/struct.IndexPage.html index 317ce61b..8d6051a6 100644 --- a/mcaptcha/pages/auth/login/struct.IndexPage.html +++ b/mcaptcha/pages/auth/login/struct.IndexPage.html @@ -1,121 +1,117 @@ -mcaptcha::pages::auth::login::IndexPage - Rust +IndexPage in mcaptcha::pages::auth::login - Rust -

Struct mcaptcha::pages::auth::login::IndexPage[][src]

struct IndexPage;

Trait Implementations

impl Clone for IndexPage[src]

impl Default for IndexPage[src]

impl Sealed for IndexPage[src]

impl TemplateOnce for IndexPage[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/login/struct.login.html b/mcaptcha/pages/auth/login/struct.login.html index 7eda3db1..60bb6bb1 100644 --- a/mcaptcha/pages/auth/login/struct.login.html +++ b/mcaptcha/pages/auth/login/struct.login.html @@ -1,112 +1,108 @@ -mcaptcha::pages::auth::login::login - Rust +login in mcaptcha::pages::auth::login - Rust -

Struct mcaptcha::pages::auth::login::login[][src]

pub struct login;

Trait Implementations

impl HttpServiceFactory for login[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/register/constant.PAGE.html b/mcaptcha/pages/auth/register/constant.PAGE.html index e410c43c..16ef82ba 100644 --- a/mcaptcha/pages/auth/register/constant.PAGE.html +++ b/mcaptcha/pages/auth/register/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::pages::auth::register::PAGE - Rust +PAGE in mcaptcha::pages::auth::register - Rust -

Constant mcaptcha::pages::auth::register::PAGE[][src]

const PAGE: &str = "Join";
- \ No newline at end of file +

Constant mcaptcha::pages::auth::register::PAGE[][src]

const PAGE: &str = "Join";
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/register/index.html b/mcaptcha/pages/auth/register/index.html index 7ed7e279..ee042acd 100644 --- a/mcaptcha/pages/auth/register/index.html +++ b/mcaptcha/pages/auth/register/index.html @@ -1,7 +1,7 @@ -mcaptcha::pages::auth::register - Rust +mcaptcha::pages::auth::register - Rust -

Module mcaptcha::pages::auth::register[][src]

Structs

+

Module mcaptcha::pages::auth::register[][src]

Structs

INDEX
IndexPage
join

Constants

-
PAGE
- \ No newline at end of file +
PAGE
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/register/struct.INDEX.html b/mcaptcha/pages/auth/register/struct.INDEX.html index 1476df7d..9c68f116 100644 --- a/mcaptcha/pages/auth/register/struct.INDEX.html +++ b/mcaptcha/pages/auth/register/struct.INDEX.html @@ -1,1555 +1,161 @@ -mcaptcha::pages::auth::register::INDEX - Rust +INDEX in mcaptcha::pages::auth::register - Rust -

Struct mcaptcha::pages::auth::register::INDEX[][src]

struct INDEX {
+

Struct mcaptcha::pages::auth::register::INDEX[][src]

struct INDEX {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

+ Fields__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

Examples

Basic usage:

-let s = String::from("foo");
+let s = String::from("foo");
 
-assert_eq!("foo", s.as_str());
-

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String's capacity, in bytes.

+assert_eq!("foo", s.as_str());
+

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String’s capacity, in bytes.

Examples

Basic usage:

-let s = String::with_capacity(10);
+let s = String::with_capacity(10);
 
-assert!(s.capacity() >= 10);
-

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String's contents.

+assert!(s.capacity() >= 10);
+

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String’s contents.

The inverse of this method is from_utf8.

Examples

Basic usage:

-let s = String::from("hello");
+let s = String::from("hello");
 
-assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
-

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or +assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());

+

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

-let a = String::from("foo");
-assert_eq!(a.len(), 3);
+let a = String::from("foo");
+assert_eq!(a.len(), 3);
 
-let fancy_f = String::from("ƒoo");
-assert_eq!(fancy_f.len(), 4);
-assert_eq!(fancy_f.chars().count(), 3);
-

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

+let fancy_f = String::from("ƒoo"); +assert_eq!(fancy_f.len(), 4); +assert_eq!(fancy_f.chars().count(), 3);
+

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

Examples

Basic usage:

-let mut v = String::new();
-assert!(v.is_empty());
+let mut v = String::new();
+assert!(v.is_empty());
 
 v.push('a');
-assert!(!v.is_empty());
-

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]1.20.0[src]

Converts a mutable string slice to a mutable byte slice.

-

Safety

-

The caller must ensure that the content of the slice is valid UTF-8 -before the borrow ends and the underlying str is used.

-

Use of a str whose contents are not valid UTF-8 is undefined behavior.

-

Examples

-

Basic usage:

- -
-let mut s = String::from("Hello");
-let bytes = unsafe { s.as_bytes_mut() };
-
-assert_eq!(b"Hello", bytes);
-

Mutability:

- -
-let mut s = String::from("🗻∈🌏");
-
-unsafe {
-    let bytes = s.as_bytes_mut();
-
-    bytes[0] = 0xF0;
-    bytes[1] = 0x9F;
-    bytes[2] = 0x8D;
-    bytes[3] = 0x94;
-}
-
-assert_eq!("🍔∈🌏", s);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn as_mut_ptr(&mut self) -> *mut u81.36.0[src]

Converts a mutable string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

It is your responsibility to make sure that the string slice only gets -modified in a way that it remains valid UTF-8.

-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub fn get_mut<I>(
    &mut self,
    i: I
) -> Option<&mut <I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let mut v = String::from("hello");
-// correct length
-assert!(v.get_mut(0..5).is_some());
-// out of bounds
-assert!(v.get_mut(..42).is_none());
-assert_eq!(Some("he"), v.get_mut(0..2).map(|v| &*v));
-
-assert_eq!("hello", v);
-{
-    let s = v.get_mut(0..2);
-    let s = s.map(|s| {
-        s.make_ascii_uppercase();
-        &*s
-    });
-    assert_eq!(Some("HE"), s);
-}
-assert_eq!("HEllo", v);
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn get_unchecked_mut<I>(
    &mut self,
    i: I
) -> &mut <I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable, unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let mut v = String::from("🗻∈🌏");
-unsafe {
-    assert_eq!("🗻", v.get_unchecked_mut(0..4));
-    assert_eq!("∈", v.get_unchecked_mut(4..7));
-    assert_eq!("🌏", v.get_unchecked_mut(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub unsafe fn slice_mut_unchecked(
    &mut self,
    begin: usize,
    end: usize
) -> &mut str
1.5.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked_mut(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks. -This is generally not recommended, use with caution! For a safe -alternative see str and IndexMut.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get an immutable string slice instead, see the -slice_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)1.4.0[src]

Divide one mutable string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get immutable string slices instead, see the split_at method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let mut s = "Per Martin-Löf".to_string();
-{
-    let (first, last) = s.split_at_mut(3);
-    first.make_ascii_uppercase();
-    assert_eq!("PER", first);
-    assert_eq!(" Martin-Löf", last);
-}
-assert_eq!("PER Martin-Löf", s);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn make_ascii_uppercase(&mut self)1.23.0[src]

Converts this string to its ASCII upper case equivalent in-place.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase().

-

Examples

-
-let mut s = String::from("Grüße, Jürgen ❤");
-
-s.make_ascii_uppercase();
-
-assert_eq!("GRüßE, JüRGEN ❤", s);
-

pub fn make_ascii_lowercase(&mut self)1.23.0[src]

Converts this string to its ASCII lower case equivalent in-place.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase().

-

Examples

-
-let mut s = String::from("GRÜßE, JÜRGEN ❤");
-
-s.make_ascii_lowercase();
-
-assert_eq!("grÜße, jÜrgen ❤", s);
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for INDEX[src]

type Target = String

The resulting type after dereferencing.

-

impl LazyStatic for INDEX[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

+

Trait Implementations

impl Deref for INDEX[src]

type Target = String

The resulting type after dereferencing.

+

impl LazyStatic for INDEX[src]

Auto Trait Implementations

impl RefUnwindSafe for INDEX

impl Send for INDEX

impl Sync for INDEX

impl Unpin for INDEX

impl UnwindSafe for INDEX

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/register/struct.IndexPage.html b/mcaptcha/pages/auth/register/struct.IndexPage.html index 1a495a26..060ff426 100644 --- a/mcaptcha/pages/auth/register/struct.IndexPage.html +++ b/mcaptcha/pages/auth/register/struct.IndexPage.html @@ -1,121 +1,117 @@ -mcaptcha::pages::auth::register::IndexPage - Rust +IndexPage in mcaptcha::pages::auth::register - Rust -

Struct mcaptcha::pages::auth::register::IndexPage[][src]

struct IndexPage;

Trait Implementations

impl Clone for IndexPage[src]

impl Default for IndexPage[src]

impl Sealed for IndexPage[src]

impl TemplateOnce for IndexPage[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/register/struct.join.html b/mcaptcha/pages/auth/register/struct.join.html index b0e5c024..a342688b 100644 --- a/mcaptcha/pages/auth/register/struct.join.html +++ b/mcaptcha/pages/auth/register/struct.join.html @@ -1,112 +1,108 @@ -mcaptcha::pages::auth::register::join - Rust +join in mcaptcha::pages::auth::register - Rust -

Struct mcaptcha::pages::auth::register::join[][src]

pub struct join;

Trait Implementations

impl HttpServiceFactory for join[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/routes/index.html b/mcaptcha/pages/auth/routes/index.html index 7b94af96..565ca991 100644 --- a/mcaptcha/pages/auth/routes/index.html +++ b/mcaptcha/pages/auth/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::pages::auth::routes - Rust +mcaptcha::pages::auth::routes - Rust -

Module mcaptcha::pages::auth::routes[][src]

Structs

-
Auth
- \ No newline at end of file +

Module mcaptcha::pages::auth::routes[][src]

Structs

+
Auth
+ \ No newline at end of file diff --git a/mcaptcha/pages/auth/routes/struct.Auth.html b/mcaptcha/pages/auth/routes/struct.Auth.html index f8414ce4..31efd9fd 100644 --- a/mcaptcha/pages/auth/routes/struct.Auth.html +++ b/mcaptcha/pages/auth/routes/struct.Auth.html @@ -1,116 +1,112 @@ -mcaptcha::pages::auth::routes::Auth - Rust +Auth in mcaptcha::pages::auth::routes - Rust -

Struct mcaptcha::pages::auth::routes::Auth[][src]

pub struct Auth {
+

Struct mcaptcha::pages::auth::routes::Auth[][src]

pub struct Auth {
     pub login: &'static str,
     pub join: &'static str,
 }

- Fields

login: &'static strjoin: &'static str

Implementations

impl Auth[src]

pub const fn new() -> Auth[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/constant.NAME.html b/mcaptcha/pages/constant.NAME.html index 26b11e48..cb548776 100644 --- a/mcaptcha/pages/constant.NAME.html +++ b/mcaptcha/pages/constant.NAME.html @@ -1,5 +1,5 @@ -mcaptcha::pages::NAME - Rust +NAME in mcaptcha::pages - Rust -

Constant mcaptcha::pages::NAME[][src]

pub const NAME: &str = "mCaptcha";
- \ No newline at end of file +

Constant mcaptcha::pages::NAME[][src]

pub const NAME: &str = "mCaptcha";
+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/constant.PAGE.html b/mcaptcha/pages/errors/constant.PAGE.html index 8da7e20d..9a0a6a97 100644 --- a/mcaptcha/pages/errors/constant.PAGE.html +++ b/mcaptcha/pages/errors/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::pages::errors::PAGE - Rust +PAGE in mcaptcha::pages::errors - Rust -

Constant mcaptcha::pages::errors::PAGE[][src]

const PAGE: &str = "Error";
- \ No newline at end of file +

Constant mcaptcha::pages::errors::PAGE[][src]

const PAGE: &str = "Error";
+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/fn.error.html b/mcaptcha/pages/errors/fn.error.html index 73bf52e6..76221f5f 100644 --- a/mcaptcha/pages/errors/fn.error.html +++ b/mcaptcha/pages/errors/fn.error.html @@ -1,5 +1,5 @@ -mcaptcha::pages::errors::error - Rust +error in mcaptcha::pages::errors - Rust -

Function mcaptcha::pages::errors::error[][src]

async fn error(path: Path<usize>) -> impl Responder
- \ No newline at end of file +

Function mcaptcha::pages::errors::error[][src]

async fn error(path: Path<usize>) -> impl Responder
+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/fn.services.html b/mcaptcha/pages/errors/fn.services.html index dbf2e368..4606166d 100644 --- a/mcaptcha/pages/errors/fn.services.html +++ b/mcaptcha/pages/errors/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::pages::errors::services - Rust +services in mcaptcha::pages::errors - Rust -

Function mcaptcha::pages::errors::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::pages::errors::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/index.html b/mcaptcha/pages/errors/index.html index fa95ac09..f1fd8c0d 100644 --- a/mcaptcha/pages/errors/index.html +++ b/mcaptcha/pages/errors/index.html @@ -1,9 +1,9 @@ -mcaptcha::pages::errors - Rust +mcaptcha::pages::errors - Rust -

Module mcaptcha::pages::errors[][src]

Modules

+

Module mcaptcha::pages::errors[][src]

Modules

routes

Structs

ErrorPage
INTERNAL_SERVER_ERROR_BODY
UNKNOWN_ERROR_BODY

Constants

PAGE

Functions

-
error
services
- \ No newline at end of file +
error
services
+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/routes/index.html b/mcaptcha/pages/errors/routes/index.html index 283d723f..166029b1 100644 --- a/mcaptcha/pages/errors/routes/index.html +++ b/mcaptcha/pages/errors/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::pages::errors::routes - Rust +mcaptcha::pages::errors::routes - Rust -

Module mcaptcha::pages::errors::routes[][src]

Structs

-
Errors
- \ No newline at end of file +

Module mcaptcha::pages::errors::routes[][src]

Structs

+
Errors
+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/routes/struct.Errors.html b/mcaptcha/pages/errors/routes/struct.Errors.html index e41ad9c3..03b67cc5 100644 --- a/mcaptcha/pages/errors/routes/struct.Errors.html +++ b/mcaptcha/pages/errors/routes/struct.Errors.html @@ -1,116 +1,112 @@ -mcaptcha::pages::errors::routes::Errors - Rust +Errors in mcaptcha::pages::errors::routes - Rust -

Struct mcaptcha::pages::errors::routes::Errors[][src]

pub struct Errors {
+

Struct mcaptcha::pages::errors::routes::Errors[][src]

pub struct Errors {
     pub internal_server_error: &'static str,
     pub unknown_error: &'static str,
 }

- Fields

internal_server_error: &'static strunknown_error: &'static str

Implementations

impl Errors[src]

pub const fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/struct.ErrorPage.html b/mcaptcha/pages/errors/struct.ErrorPage.html index 45eb5ada..9c4c8438 100644 --- a/mcaptcha/pages/errors/struct.ErrorPage.html +++ b/mcaptcha/pages/errors/struct.ErrorPage.html @@ -1,124 +1,120 @@ -mcaptcha::pages::errors::ErrorPage - Rust +ErrorPage in mcaptcha::pages::errors - Rust -

Struct mcaptcha::pages::errors::ErrorPage[][src]

struct ErrorPage<'a> {
+

Struct mcaptcha::pages::errors::ErrorPage[][src]

struct ErrorPage<'a> {
     title: &'a str,
     message: &'a str,
 }

- Fields

title: &'a strmessage: &'a str

Implementations

impl<'a> ErrorPage<'a>[src]

fn new(title: &'a str, message: &'a str) -> Self[src]

Trait Implementations

impl<'a> Clone for ErrorPage<'a>[src]

impl<'a> Sealed for ErrorPage<'a>[src]

impl<'a> TemplateOnce for ErrorPage<'a>[src]

Auto Trait Implementations

impl<'a> RefUnwindSafe for ErrorPage<'a>[src]

impl<'a> Send for ErrorPage<'a>[src]

impl<'a> Sync for ErrorPage<'a>[src]

impl<'a> Unpin for ErrorPage<'a>[src]

impl<'a> UnwindSafe for ErrorPage<'a>[src]

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html b/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html index e88a2c44..26559de7 100644 --- a/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html +++ b/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html @@ -1,1555 +1,161 @@ -mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY - Rust +INTERNAL_SERVER_ERROR_BODY in mcaptcha::pages::errors - Rust -

Struct mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY[][src]

struct INTERNAL_SERVER_ERROR_BODY {
+

Struct mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY[][src]

struct INTERNAL_SERVER_ERROR_BODY {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

+ Fields__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

Examples

Basic usage:

-let s = String::from("foo");
+let s = String::from("foo");
 
-assert_eq!("foo", s.as_str());
-

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String's capacity, in bytes.

+assert_eq!("foo", s.as_str());
+

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String’s capacity, in bytes.

Examples

Basic usage:

-let s = String::with_capacity(10);
+let s = String::with_capacity(10);
 
-assert!(s.capacity() >= 10);
-

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String's contents.

+assert!(s.capacity() >= 10);
+

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String’s contents.

The inverse of this method is from_utf8.

Examples

Basic usage:

-let s = String::from("hello");
+let s = String::from("hello");
 
-assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
-

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or +assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());

+

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

-let a = String::from("foo");
-assert_eq!(a.len(), 3);
+let a = String::from("foo");
+assert_eq!(a.len(), 3);
 
-let fancy_f = String::from("ƒoo");
-assert_eq!(fancy_f.len(), 4);
-assert_eq!(fancy_f.chars().count(), 3);
-

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

+let fancy_f = String::from("ƒoo"); +assert_eq!(fancy_f.len(), 4); +assert_eq!(fancy_f.chars().count(), 3);
+

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

Examples

Basic usage:

-let mut v = String::new();
-assert!(v.is_empty());
+let mut v = String::new();
+assert!(v.is_empty());
 
 v.push('a');
-assert!(!v.is_empty());
-

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]1.20.0[src]

Converts a mutable string slice to a mutable byte slice.

-

Safety

-

The caller must ensure that the content of the slice is valid UTF-8 -before the borrow ends and the underlying str is used.

-

Use of a str whose contents are not valid UTF-8 is undefined behavior.

-

Examples

-

Basic usage:

- -
-let mut s = String::from("Hello");
-let bytes = unsafe { s.as_bytes_mut() };
-
-assert_eq!(b"Hello", bytes);
-

Mutability:

- -
-let mut s = String::from("🗻∈🌏");
-
-unsafe {
-    let bytes = s.as_bytes_mut();
-
-    bytes[0] = 0xF0;
-    bytes[1] = 0x9F;
-    bytes[2] = 0x8D;
-    bytes[3] = 0x94;
-}
-
-assert_eq!("🍔∈🌏", s);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn as_mut_ptr(&mut self) -> *mut u81.36.0[src]

Converts a mutable string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

It is your responsibility to make sure that the string slice only gets -modified in a way that it remains valid UTF-8.

-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub fn get_mut<I>(
    &mut self,
    i: I
) -> Option<&mut <I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let mut v = String::from("hello");
-// correct length
-assert!(v.get_mut(0..5).is_some());
-// out of bounds
-assert!(v.get_mut(..42).is_none());
-assert_eq!(Some("he"), v.get_mut(0..2).map(|v| &*v));
-
-assert_eq!("hello", v);
-{
-    let s = v.get_mut(0..2);
-    let s = s.map(|s| {
-        s.make_ascii_uppercase();
-        &*s
-    });
-    assert_eq!(Some("HE"), s);
-}
-assert_eq!("HEllo", v);
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn get_unchecked_mut<I>(
    &mut self,
    i: I
) -> &mut <I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable, unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let mut v = String::from("🗻∈🌏");
-unsafe {
-    assert_eq!("🗻", v.get_unchecked_mut(0..4));
-    assert_eq!("∈", v.get_unchecked_mut(4..7));
-    assert_eq!("🌏", v.get_unchecked_mut(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub unsafe fn slice_mut_unchecked(
    &mut self,
    begin: usize,
    end: usize
) -> &mut str
1.5.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked_mut(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks. -This is generally not recommended, use with caution! For a safe -alternative see str and IndexMut.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get an immutable string slice instead, see the -slice_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)1.4.0[src]

Divide one mutable string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get immutable string slices instead, see the split_at method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let mut s = "Per Martin-Löf".to_string();
-{
-    let (first, last) = s.split_at_mut(3);
-    first.make_ascii_uppercase();
-    assert_eq!("PER", first);
-    assert_eq!(" Martin-Löf", last);
-}
-assert_eq!("PER Martin-Löf", s);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn make_ascii_uppercase(&mut self)1.23.0[src]

Converts this string to its ASCII upper case equivalent in-place.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase().

-

Examples

-
-let mut s = String::from("Grüße, Jürgen ❤");
-
-s.make_ascii_uppercase();
-
-assert_eq!("GRüßE, JüRGEN ❤", s);
-

pub fn make_ascii_lowercase(&mut self)1.23.0[src]

Converts this string to its ASCII lower case equivalent in-place.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase().

-

Examples

-
-let mut s = String::from("GRÜßE, JÜRGEN ❤");
-
-s.make_ascii_lowercase();
-
-assert_eq!("grÜße, jÜrgen ❤", s);
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for INTERNAL_SERVER_ERROR_BODY[src]

type Target = String

The resulting type after dereferencing.

-

impl LazyStatic for INTERNAL_SERVER_ERROR_BODY[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

+

Trait Implementations

impl Deref for INTERNAL_SERVER_ERROR_BODY[src]

type Target = String

The resulting type after dereferencing.

+

impl LazyStatic for INTERNAL_SERVER_ERROR_BODY[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html b/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html index 76785563..0f9762dd 100644 --- a/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html +++ b/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html @@ -1,1555 +1,161 @@ -mcaptcha::pages::errors::UNKNOWN_ERROR_BODY - Rust +UNKNOWN_ERROR_BODY in mcaptcha::pages::errors - Rust -

Struct mcaptcha::pages::errors::UNKNOWN_ERROR_BODY[][src]

struct UNKNOWN_ERROR_BODY {
+

Struct mcaptcha::pages::errors::UNKNOWN_ERROR_BODY[][src]

struct UNKNOWN_ERROR_BODY {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

+ Fields__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

Examples

Basic usage:

-let s = String::from("foo");
+let s = String::from("foo");
 
-assert_eq!("foo", s.as_str());
-

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String's capacity, in bytes.

+assert_eq!("foo", s.as_str());
+

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String’s capacity, in bytes.

Examples

Basic usage:

-let s = String::with_capacity(10);
+let s = String::with_capacity(10);
 
-assert!(s.capacity() >= 10);
-

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String's contents.

+assert!(s.capacity() >= 10);
+

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String’s contents.

The inverse of this method is from_utf8.

Examples

Basic usage:

-let s = String::from("hello");
+let s = String::from("hello");
 
-assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
-

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or +assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());

+

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

-let a = String::from("foo");
-assert_eq!(a.len(), 3);
+let a = String::from("foo");
+assert_eq!(a.len(), 3);
 
-let fancy_f = String::from("ƒoo");
-assert_eq!(fancy_f.len(), 4);
-assert_eq!(fancy_f.chars().count(), 3);
-

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

+let fancy_f = String::from("ƒoo"); +assert_eq!(fancy_f.len(), 4); +assert_eq!(fancy_f.chars().count(), 3);
+

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

Examples

Basic usage:

-let mut v = String::new();
-assert!(v.is_empty());
+let mut v = String::new();
+assert!(v.is_empty());
 
 v.push('a');
-assert!(!v.is_empty());
-

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]1.20.0[src]

Converts a mutable string slice to a mutable byte slice.

-

Safety

-

The caller must ensure that the content of the slice is valid UTF-8 -before the borrow ends and the underlying str is used.

-

Use of a str whose contents are not valid UTF-8 is undefined behavior.

-

Examples

-

Basic usage:

- -
-let mut s = String::from("Hello");
-let bytes = unsafe { s.as_bytes_mut() };
-
-assert_eq!(b"Hello", bytes);
-

Mutability:

- -
-let mut s = String::from("🗻∈🌏");
-
-unsafe {
-    let bytes = s.as_bytes_mut();
-
-    bytes[0] = 0xF0;
-    bytes[1] = 0x9F;
-    bytes[2] = 0x8D;
-    bytes[3] = 0x94;
-}
-
-assert_eq!("🍔∈🌏", s);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn as_mut_ptr(&mut self) -> *mut u81.36.0[src]

Converts a mutable string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

It is your responsibility to make sure that the string slice only gets -modified in a way that it remains valid UTF-8.

-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub fn get_mut<I>(
    &mut self,
    i: I
) -> Option<&mut <I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let mut v = String::from("hello");
-// correct length
-assert!(v.get_mut(0..5).is_some());
-// out of bounds
-assert!(v.get_mut(..42).is_none());
-assert_eq!(Some("he"), v.get_mut(0..2).map(|v| &*v));
-
-assert_eq!("hello", v);
-{
-    let s = v.get_mut(0..2);
-    let s = s.map(|s| {
-        s.make_ascii_uppercase();
-        &*s
-    });
-    assert_eq!(Some("HE"), s);
-}
-assert_eq!("HEllo", v);
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn get_unchecked_mut<I>(
    &mut self,
    i: I
) -> &mut <I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable, unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let mut v = String::from("🗻∈🌏");
-unsafe {
-    assert_eq!("🗻", v.get_unchecked_mut(0..4));
-    assert_eq!("∈", v.get_unchecked_mut(4..7));
-    assert_eq!("🌏", v.get_unchecked_mut(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub unsafe fn slice_mut_unchecked(
    &mut self,
    begin: usize,
    end: usize
) -> &mut str
1.5.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked_mut(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks. -This is generally not recommended, use with caution! For a safe -alternative see str and IndexMut.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get an immutable string slice instead, see the -slice_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)1.4.0[src]

Divide one mutable string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get immutable string slices instead, see the split_at method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let mut s = "Per Martin-Löf".to_string();
-{
-    let (first, last) = s.split_at_mut(3);
-    first.make_ascii_uppercase();
-    assert_eq!("PER", first);
-    assert_eq!(" Martin-Löf", last);
-}
-assert_eq!("PER Martin-Löf", s);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn make_ascii_uppercase(&mut self)1.23.0[src]

Converts this string to its ASCII upper case equivalent in-place.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase().

-

Examples

-
-let mut s = String::from("Grüße, Jürgen ❤");
-
-s.make_ascii_uppercase();
-
-assert_eq!("GRüßE, JüRGEN ❤", s);
-

pub fn make_ascii_lowercase(&mut self)1.23.0[src]

Converts this string to its ASCII lower case equivalent in-place.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase().

-

Examples

-
-let mut s = String::from("GRÜßE, JÜRGEN ❤");
-
-s.make_ascii_lowercase();
-
-assert_eq!("grÜße, jÜrgen ❤", s);
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for UNKNOWN_ERROR_BODY[src]

type Target = String

The resulting type after dereferencing.

-

impl LazyStatic for UNKNOWN_ERROR_BODY[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

+

Trait Implementations

impl Deref for UNKNOWN_ERROR_BODY[src]

type Target = String

The resulting type after dereferencing.

+

impl LazyStatic for UNKNOWN_ERROR_BODY[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/fn.services.html b/mcaptcha/pages/fn.services.html index 9ae5c9d4..7d57a5c5 100644 --- a/mcaptcha/pages/fn.services.html +++ b/mcaptcha/pages/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::pages::services - Rust +services in mcaptcha::pages - Rust -

Function mcaptcha::pages::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::pages::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/pages/index.html b/mcaptcha/pages/index.html index 6e172d95..e00688c1 100644 --- a/mcaptcha/pages/index.html +++ b/mcaptcha/pages/index.html @@ -1,8 +1,8 @@ -mcaptcha::pages - Rust +mcaptcha::pages - Rust -

Module mcaptcha::pages[][src]

Modules

+

Module mcaptcha::pages[][src]

Modules

auth
errors
panel
routes

Constants

NAME

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/constant.PAGE.html b/mcaptcha/pages/panel/constant.PAGE.html index 978aad24..9808bc1d 100644 --- a/mcaptcha/pages/panel/constant.PAGE.html +++ b/mcaptcha/pages/panel/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::pages::panel::PAGE - Rust +PAGE in mcaptcha::pages::panel - Rust -

Constant mcaptcha::pages::panel::PAGE[][src]

const PAGE: &str = "Dashboard";
- \ No newline at end of file +

Constant mcaptcha::pages::panel::PAGE[][src]

const PAGE: &str = "Dashboard";
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/fn.services.html b/mcaptcha/pages/panel/fn.services.html index e504e812..19413df2 100644 --- a/mcaptcha/pages/panel/fn.services.html +++ b/mcaptcha/pages/panel/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::pages::panel::services - Rust +services in mcaptcha::pages::panel - Rust -

Function mcaptcha::pages::panel::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::pages::panel::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/index.html b/mcaptcha/pages/panel/index.html index b7998a78..786990f0 100644 --- a/mcaptcha/pages/panel/index.html +++ b/mcaptcha/pages/panel/index.html @@ -1,9 +1,9 @@ -mcaptcha::pages::panel - Rust +mcaptcha::pages::panel - Rust -

Module mcaptcha::pages::panel[][src]

Modules

+

Module mcaptcha::pages::panel[][src]

Modules

routes
sitekey

Structs

IndexPage
panel

Constants

PAGE

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/routes/index.html b/mcaptcha/pages/panel/routes/index.html index d37b942f..4570d5b3 100644 --- a/mcaptcha/pages/panel/routes/index.html +++ b/mcaptcha/pages/panel/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::pages::panel::routes - Rust +mcaptcha::pages::panel::routes - Rust -

Module mcaptcha::pages::panel::routes[][src]

Structs

-
Panel
- \ No newline at end of file +

Module mcaptcha::pages::panel::routes[][src]

Structs

+
Panel
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/routes/struct.Panel.html b/mcaptcha/pages/panel/routes/struct.Panel.html index 9c35eedc..588beccb 100644 --- a/mcaptcha/pages/panel/routes/struct.Panel.html +++ b/mcaptcha/pages/panel/routes/struct.Panel.html @@ -1,116 +1,112 @@ -mcaptcha::pages::panel::routes::Panel - Rust +Panel in mcaptcha::pages::panel::routes - Rust -

Struct mcaptcha::pages::panel::routes::Panel[][src]

pub struct Panel {
+

Struct mcaptcha::pages::panel::routes::Panel[][src]

pub struct Panel {
     pub home: &'static str,
-    pub sitekey: Sitekey,
+    pub sitekey: Sitekey,
 }

- Fields

home: &'static strsitekey: Sitekey

Implementations

impl Panel[src]

pub const fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/add/constant.PAGE.html b/mcaptcha/pages/panel/sitekey/add/constant.PAGE.html index 8ccd51f0..0d5216bb 100644 --- a/mcaptcha/pages/panel/sitekey/add/constant.PAGE.html +++ b/mcaptcha/pages/panel/sitekey/add/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::pages::panel::sitekey::add::PAGE - Rust +PAGE in mcaptcha::pages::panel::sitekey::add - Rust -

Constant mcaptcha::pages::panel::sitekey::add::PAGE[][src]

const PAGE: &str = "Add Sitekey";
- \ No newline at end of file +

Constant mcaptcha::pages::panel::sitekey::add::PAGE[][src]

const PAGE: &str = "Add Sitekey";
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/add/index.html b/mcaptcha/pages/panel/sitekey/add/index.html index 8358dda0..3e7b0266 100644 --- a/mcaptcha/pages/panel/sitekey/add/index.html +++ b/mcaptcha/pages/panel/sitekey/add/index.html @@ -1,7 +1,7 @@ -mcaptcha::pages::panel::sitekey::add - Rust +mcaptcha::pages::panel::sitekey::add - Rust -

Module mcaptcha::pages::panel::sitekey::add[][src]

Structs

+

Module mcaptcha::pages::panel::sitekey::add[][src]

Structs

INDEX
IndexPage
add_sitekey

Constants

-
PAGE
- \ No newline at end of file +
PAGE
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/add/struct.INDEX.html b/mcaptcha/pages/panel/sitekey/add/struct.INDEX.html index 82cbc551..9138ccdf 100644 --- a/mcaptcha/pages/panel/sitekey/add/struct.INDEX.html +++ b/mcaptcha/pages/panel/sitekey/add/struct.INDEX.html @@ -1,1555 +1,161 @@ -mcaptcha::pages::panel::sitekey::add::INDEX - Rust +INDEX in mcaptcha::pages::panel::sitekey::add - Rust -

Struct mcaptcha::pages::panel::sitekey::add::INDEX[][src]

struct INDEX {
+

Struct mcaptcha::pages::panel::sitekey::add::INDEX[][src]

struct INDEX {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

+ Fields__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

Examples

Basic usage:

-let s = String::from("foo");
+let s = String::from("foo");
 
-assert_eq!("foo", s.as_str());
-

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String's capacity, in bytes.

+assert_eq!("foo", s.as_str());
+

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String’s capacity, in bytes.

Examples

Basic usage:

-let s = String::with_capacity(10);
+let s = String::with_capacity(10);
 
-assert!(s.capacity() >= 10);
-

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String's contents.

+assert!(s.capacity() >= 10);
+

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String’s contents.

The inverse of this method is from_utf8.

Examples

Basic usage:

-let s = String::from("hello");
+let s = String::from("hello");
 
-assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
-

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or +assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());

+

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

-let a = String::from("foo");
-assert_eq!(a.len(), 3);
+let a = String::from("foo");
+assert_eq!(a.len(), 3);
 
-let fancy_f = String::from("ƒoo");
-assert_eq!(fancy_f.len(), 4);
-assert_eq!(fancy_f.chars().count(), 3);
-

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

+let fancy_f = String::from("ƒoo"); +assert_eq!(fancy_f.len(), 4); +assert_eq!(fancy_f.chars().count(), 3);
+

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

Examples

Basic usage:

-let mut v = String::new();
-assert!(v.is_empty());
+let mut v = String::new();
+assert!(v.is_empty());
 
 v.push('a');
-assert!(!v.is_empty());
-

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]1.20.0[src]

Converts a mutable string slice to a mutable byte slice.

-

Safety

-

The caller must ensure that the content of the slice is valid UTF-8 -before the borrow ends and the underlying str is used.

-

Use of a str whose contents are not valid UTF-8 is undefined behavior.

-

Examples

-

Basic usage:

- -
-let mut s = String::from("Hello");
-let bytes = unsafe { s.as_bytes_mut() };
-
-assert_eq!(b"Hello", bytes);
-

Mutability:

- -
-let mut s = String::from("🗻∈🌏");
-
-unsafe {
-    let bytes = s.as_bytes_mut();
-
-    bytes[0] = 0xF0;
-    bytes[1] = 0x9F;
-    bytes[2] = 0x8D;
-    bytes[3] = 0x94;
-}
-
-assert_eq!("🍔∈🌏", s);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn as_mut_ptr(&mut self) -> *mut u81.36.0[src]

Converts a mutable string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

It is your responsibility to make sure that the string slice only gets -modified in a way that it remains valid UTF-8.

-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub fn get_mut<I>(
    &mut self,
    i: I
) -> Option<&mut <I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let mut v = String::from("hello");
-// correct length
-assert!(v.get_mut(0..5).is_some());
-// out of bounds
-assert!(v.get_mut(..42).is_none());
-assert_eq!(Some("he"), v.get_mut(0..2).map(|v| &*v));
-
-assert_eq!("hello", v);
-{
-    let s = v.get_mut(0..2);
-    let s = s.map(|s| {
-        s.make_ascii_uppercase();
-        &*s
-    });
-    assert_eq!(Some("HE"), s);
-}
-assert_eq!("HEllo", v);
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn get_unchecked_mut<I>(
    &mut self,
    i: I
) -> &mut <I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable, unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let mut v = String::from("🗻∈🌏");
-unsafe {
-    assert_eq!("🗻", v.get_unchecked_mut(0..4));
-    assert_eq!("∈", v.get_unchecked_mut(4..7));
-    assert_eq!("🌏", v.get_unchecked_mut(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub unsafe fn slice_mut_unchecked(
    &mut self,
    begin: usize,
    end: usize
) -> &mut str
1.5.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked_mut(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks. -This is generally not recommended, use with caution! For a safe -alternative see str and IndexMut.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get an immutable string slice instead, see the -slice_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)1.4.0[src]

Divide one mutable string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get immutable string slices instead, see the split_at method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let mut s = "Per Martin-Löf".to_string();
-{
-    let (first, last) = s.split_at_mut(3);
-    first.make_ascii_uppercase();
-    assert_eq!("PER", first);
-    assert_eq!(" Martin-Löf", last);
-}
-assert_eq!("PER Martin-Löf", s);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn make_ascii_uppercase(&mut self)1.23.0[src]

Converts this string to its ASCII upper case equivalent in-place.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase().

-

Examples

-
-let mut s = String::from("Grüße, Jürgen ❤");
-
-s.make_ascii_uppercase();
-
-assert_eq!("GRüßE, JüRGEN ❤", s);
-

pub fn make_ascii_lowercase(&mut self)1.23.0[src]

Converts this string to its ASCII lower case equivalent in-place.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase().

-

Examples

-
-let mut s = String::from("GRÜßE, JÜRGEN ❤");
-
-s.make_ascii_lowercase();
-
-assert_eq!("grÜße, jÜrgen ❤", s);
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for INDEX[src]

type Target = String

The resulting type after dereferencing.

-

impl LazyStatic for INDEX[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

+

Trait Implementations

impl Deref for INDEX[src]

type Target = String

The resulting type after dereferencing.

+

impl LazyStatic for INDEX[src]

Auto Trait Implementations

impl RefUnwindSafe for INDEX

impl Send for INDEX

impl Sync for INDEX

impl Unpin for INDEX

impl UnwindSafe for INDEX

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/add/struct.IndexPage.html b/mcaptcha/pages/panel/sitekey/add/struct.IndexPage.html index 28992f2c..01203e38 100644 --- a/mcaptcha/pages/panel/sitekey/add/struct.IndexPage.html +++ b/mcaptcha/pages/panel/sitekey/add/struct.IndexPage.html @@ -1,127 +1,123 @@ -mcaptcha::pages::panel::sitekey::add::IndexPage - Rust +IndexPage in mcaptcha::pages::panel::sitekey::add - Rust -

Struct mcaptcha::pages::panel::sitekey::add::IndexPage[][src]

pub struct IndexPage<'a> {
+

Struct mcaptcha::pages::panel::sitekey::add::IndexPage[][src]

pub struct IndexPage<'a> {
     pub levels: usize,
     pub form_title: &'a str,
     pub form_description: &'a str,
     pub form_duration: usize,
 }

- Fields

levels: usizeform_title: &'a strform_description: &'a strform_duration: usize

Trait Implementations

impl<'a> Clone for IndexPage<'a>[src]

impl<'a> Default for IndexPage<'a>[src]

impl<'a> Sealed for IndexPage<'a>[src]

impl<'a> TemplateOnce for IndexPage<'a>[src]

Auto Trait Implementations

impl<'a> RefUnwindSafe for IndexPage<'a>[src]

impl<'a> Send for IndexPage<'a>[src]

impl<'a> Sync for IndexPage<'a>[src]

impl<'a> Unpin for IndexPage<'a>[src]

impl<'a> UnwindSafe for IndexPage<'a>[src]

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/add/struct.add_sitekey.html b/mcaptcha/pages/panel/sitekey/add/struct.add_sitekey.html index 4cc7cf57..c2b9d3b2 100644 --- a/mcaptcha/pages/panel/sitekey/add/struct.add_sitekey.html +++ b/mcaptcha/pages/panel/sitekey/add/struct.add_sitekey.html @@ -1,112 +1,108 @@ -mcaptcha::pages::panel::sitekey::add::add_sitekey - Rust +add_sitekey in mcaptcha::pages::panel::sitekey::add - Rust -

Struct mcaptcha::pages::panel::sitekey::add::add_sitekey[][src]

pub struct add_sitekey;

Trait Implementations

impl HttpServiceFactory for add_sitekey[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/fn.services.html b/mcaptcha/pages/panel/sitekey/fn.services.html index 2797f4b7..41c5fd3c 100644 --- a/mcaptcha/pages/panel/sitekey/fn.services.html +++ b/mcaptcha/pages/panel/sitekey/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::pages::panel::sitekey::services - Rust +services in mcaptcha::pages::panel::sitekey - Rust -

Function mcaptcha::pages::panel::sitekey::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::pages::panel::sitekey::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/index.html b/mcaptcha/pages/panel/sitekey/index.html index cd42e333..2f514e61 100644 --- a/mcaptcha/pages/panel/sitekey/index.html +++ b/mcaptcha/pages/panel/sitekey/index.html @@ -1,7 +1,7 @@ -mcaptcha::pages::panel::sitekey - Rust +mcaptcha::pages::panel::sitekey - Rust -

Module mcaptcha::pages::panel::sitekey[][src]

Modules

+

Module mcaptcha::pages::panel::sitekey[][src]

Modules

add
list
routes
view

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html b/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html index 307c1503..d80b1d9e 100644 --- a/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html +++ b/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::pages::panel::sitekey::list::PAGE - Rust +PAGE in mcaptcha::pages::panel::sitekey::list - Rust -

Constant mcaptcha::pages::panel::sitekey::list::PAGE[][src]

const PAGE: &str = "SiteKeys";
- \ No newline at end of file +

Constant mcaptcha::pages::panel::sitekey::list::PAGE[][src]

const PAGE: &str = "SiteKeys";
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html b/mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html index ce7df239..0e9e94a1 100644 --- a/mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html +++ b/mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html @@ -1,6 +1,6 @@ -mcaptcha::pages::panel::sitekey::list::get_list_sitekeys - Rust +get_list_sitekeys in mcaptcha::pages::panel::sitekey::list - Rust -

Function mcaptcha::pages::panel::sitekey::list::get_list_sitekeys[][src]

pub async fn get_list_sitekeys(
    data: &AppData,
    id: &Identity
) -> Result<Vec<MCaptchaDetails>, PageError>

utility function to get a list of all sitekeys that a user owns

-
- \ No newline at end of file +

Function mcaptcha::pages::panel::sitekey::list::get_list_sitekeys[][src]

pub async fn get_list_sitekeys(
    data: &AppData,
    id: &Identity
) -> Result<Vec<MCaptchaDetails>, PageError>

utility function to get a list of all sitekeys that a user owns

+
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/index.html b/mcaptcha/pages/panel/sitekey/list/index.html index be2e9560..cf31c892 100644 --- a/mcaptcha/pages/panel/sitekey/list/index.html +++ b/mcaptcha/pages/panel/sitekey/list/index.html @@ -1,11 +1,11 @@ -mcaptcha::pages::panel::sitekey::list - Rust +mcaptcha::pages::panel::sitekey::list - Rust -

Module mcaptcha::pages::panel::sitekey::list[][src]

Structs

+

Module mcaptcha::pages::panel::sitekey::list[][src]

Structs

IndexPage
list_sitekeys

render a list of all sitekeys that a user has

Constants

PAGE

Functions

get_list_sitekeys

utility function to get a list of all sitekeys that a user owns

Type Definitions

-
SiteKeys
- \ No newline at end of file +
SiteKeys
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html b/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html index e58cb232..3272f39a 100644 --- a/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html +++ b/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html @@ -1,123 +1,119 @@ -mcaptcha::pages::panel::sitekey::list::IndexPage - Rust +IndexPage in mcaptcha::pages::panel::sitekey::list - Rust -

Struct mcaptcha::pages::panel::sitekey::list::IndexPage[][src]

pub struct IndexPage {
-    sitekeys: Vec<MCaptchaDetails>,
+

Struct mcaptcha::pages::panel::sitekey::list::IndexPage[][src]

pub struct IndexPage {
+    sitekeys: Vec<MCaptchaDetails>,
 }

- Fields

sitekeys: Vec<MCaptchaDetails>

Implementations

impl IndexPage[src]

fn new(sitekeys: Vec<MCaptchaDetails>) -> Self[src]

Trait Implementations

impl Clone for IndexPage[src]

impl Sealed for IndexPage[src]

impl TemplateOnce for IndexPage[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html b/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html index 84a56715..0c5dc383 100644 --- a/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html +++ b/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html @@ -1,113 +1,109 @@ -mcaptcha::pages::panel::sitekey::list::list_sitekeys - Rust +list_sitekeys in mcaptcha::pages::panel::sitekey::list - Rust -

Struct mcaptcha::pages::panel::sitekey::list::list_sitekeys[][src]

pub struct list_sitekeys;

render a list of all sitekeys that a user has

-

Trait Implementations

impl HttpServiceFactory for list_sitekeys[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html b/mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html index 6c3e2125..380eca2c 100644 --- a/mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html +++ b/mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html @@ -1,5 +1,5 @@ -mcaptcha::pages::panel::sitekey::list::SiteKeys - Rust +SiteKeys in mcaptcha::pages::panel::sitekey::list - Rust -

Type Definition mcaptcha::pages::panel::sitekey::list::SiteKeys[][src]

type SiteKeys = Vec<MCaptchaDetails>;
- \ No newline at end of file +

Type Definition mcaptcha::pages::panel::sitekey::list::SiteKeys[][src]

type SiteKeys = Vec<MCaptchaDetails>;
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/routes/index.html b/mcaptcha/pages/panel/sitekey/routes/index.html index 093e7c6f..8512f892 100644 --- a/mcaptcha/pages/panel/sitekey/routes/index.html +++ b/mcaptcha/pages/panel/sitekey/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::pages::panel::sitekey::routes - Rust +mcaptcha::pages::panel::sitekey::routes - Rust -

Module mcaptcha::pages::panel::sitekey::routes[][src]

Structs

-
Sitekey
- \ No newline at end of file +

Module mcaptcha::pages::panel::sitekey::routes[][src]

Structs

+
Sitekey
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/routes/struct.Sitekey.html b/mcaptcha/pages/panel/sitekey/routes/struct.Sitekey.html index d6e9a042..c49161c4 100644 --- a/mcaptcha/pages/panel/sitekey/routes/struct.Sitekey.html +++ b/mcaptcha/pages/panel/sitekey/routes/struct.Sitekey.html @@ -1,117 +1,113 @@ -mcaptcha::pages::panel::sitekey::routes::Sitekey - Rust +Sitekey in mcaptcha::pages::panel::sitekey::routes - Rust -

Struct mcaptcha::pages::panel::sitekey::routes::Sitekey[][src]

pub struct Sitekey {
+

Struct mcaptcha::pages::panel::sitekey::routes::Sitekey[][src]

pub struct Sitekey {
     pub list: &'static str,
     pub add: &'static str,
     pub view: &'static str,
 }

- Fields

list: &'static stradd: &'static strview: &'static str

Implementations

impl Sitekey[src]

pub const fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html b/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html index ed88c6fa..0b420008 100644 --- a/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html +++ b/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::pages::panel::sitekey::view::PAGE - Rust +PAGE in mcaptcha::pages::panel::sitekey::view - Rust -

Constant mcaptcha::pages::panel::sitekey::view::PAGE[][src]

const PAGE: &str = "SiteKeys";
- \ No newline at end of file +

Constant mcaptcha::pages::panel::sitekey::view::PAGE[][src]

const PAGE: &str = "SiteKeys";
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/index.html b/mcaptcha/pages/panel/sitekey/view/index.html index 2c700cb3..f0b1ee21 100644 --- a/mcaptcha/pages/panel/sitekey/view/index.html +++ b/mcaptcha/pages/panel/sitekey/view/index.html @@ -1,8 +1,8 @@ -mcaptcha::pages::panel::sitekey::view - Rust +mcaptcha::pages::panel::sitekey::view - Rust -

Module mcaptcha::pages::panel::sitekey::view[][src]

Structs

+

Module mcaptcha::pages::panel::sitekey::view[][src]

Structs

IndexPage
Level
McaptchaConfig
view_sitekey

route handler that renders individual views for sitekeys

Constants

-
PAGE
- \ No newline at end of file +
PAGE
+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html b/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html index 7128ac6f..1ef8c630 100644 --- a/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html +++ b/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html @@ -1,126 +1,122 @@ -mcaptcha::pages::panel::sitekey::view::IndexPage - Rust +IndexPage in mcaptcha::pages::panel::sitekey::view - Rust -

Struct mcaptcha::pages::panel::sitekey::view::IndexPage[][src]

struct IndexPage {
+

Struct mcaptcha::pages::panel::sitekey::view::IndexPage[][src]

struct IndexPage {
     duration: u32,
     name: String,
     key: String,
-    levels: Vec<Level>,
+    levels: Vec<Level>,
 }

- Fields

duration: u32name: Stringkey: Stringlevels: Vec<Level>

Implementations

impl IndexPage[src]

fn new(config: McaptchaConfig, levels: Vec<Level>, key: String) -> Self[src]

Trait Implementations

impl Clone for IndexPage[src]

impl Sealed for IndexPage[src]

impl TemplateOnce for IndexPage[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/struct.Level.html b/mcaptcha/pages/panel/sitekey/view/struct.Level.html index e2c9968d..5613cc53 100644 --- a/mcaptcha/pages/panel/sitekey/view/struct.Level.html +++ b/mcaptcha/pages/panel/sitekey/view/struct.Level.html @@ -1,122 +1,118 @@ -mcaptcha::pages::panel::sitekey::view::Level - Rust +Level in mcaptcha::pages::panel::sitekey::view - Rust -

Struct mcaptcha::pages::panel::sitekey::view::Level[][src]

struct Level {
+

Struct mcaptcha::pages::panel::sitekey::view::Level[][src]

struct Level {
     difficulty_factor: i32,
     visitor_threshold: i32,
 }

- Fields

difficulty_factor: i32visitor_threshold: i32

Trait Implementations

impl Clone for Level[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/struct.McaptchaConfig.html b/mcaptcha/pages/panel/sitekey/view/struct.McaptchaConfig.html index aaf9f52c..11e450d8 100644 --- a/mcaptcha/pages/panel/sitekey/view/struct.McaptchaConfig.html +++ b/mcaptcha/pages/panel/sitekey/view/struct.McaptchaConfig.html @@ -1,123 +1,119 @@ -mcaptcha::pages::panel::sitekey::view::McaptchaConfig - Rust +McaptchaConfig in mcaptcha::pages::panel::sitekey::view - Rust -

Struct mcaptcha::pages::panel::sitekey::view::McaptchaConfig[][src]

struct McaptchaConfig {
+

Struct mcaptcha::pages::panel::sitekey::view::McaptchaConfig[][src]

struct McaptchaConfig {
     config_id: i32,
     duration: i32,
     name: String,
 }

- Fields

config_id: i32duration: i32name: String

Trait Implementations

impl Clone for McaptchaConfig[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html b/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html index 04ed7844..14c8fcda 100644 --- a/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html +++ b/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html @@ -1,113 +1,109 @@ -mcaptcha::pages::panel::sitekey::view::view_sitekey - Rust +view_sitekey in mcaptcha::pages::panel::sitekey::view - Rust -

Struct mcaptcha::pages::panel::sitekey::view::view_sitekey[][src]

pub struct view_sitekey;

route handler that renders individual views for sitekeys

-

Trait Implementations

impl HttpServiceFactory for view_sitekey[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/struct.IndexPage.html b/mcaptcha/pages/panel/struct.IndexPage.html index 4d120dbe..9f287f23 100644 --- a/mcaptcha/pages/panel/struct.IndexPage.html +++ b/mcaptcha/pages/panel/struct.IndexPage.html @@ -1,123 +1,119 @@ -mcaptcha::pages::panel::IndexPage - Rust +IndexPage in mcaptcha::pages::panel - Rust -

Struct mcaptcha::pages::panel::IndexPage[][src]

pub struct IndexPage {
-    sitekeys: Vec<MCaptchaDetails>,
+

Struct mcaptcha::pages::panel::IndexPage[][src]

pub struct IndexPage {
+    sitekeys: Vec<MCaptchaDetails>,
 }

- Fields

sitekeys: Vec<MCaptchaDetails>

Implementations

impl IndexPage[src]

fn new(sitekeys: Vec<MCaptchaDetails>) -> Self[src]

Trait Implementations

impl Clone for IndexPage[src]

impl Sealed for IndexPage[src]

impl TemplateOnce for IndexPage[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/panel/struct.panel.html b/mcaptcha/pages/panel/struct.panel.html index 9d709980..66a841a3 100644 --- a/mcaptcha/pages/panel/struct.panel.html +++ b/mcaptcha/pages/panel/struct.panel.html @@ -1,112 +1,108 @@ -mcaptcha::pages::panel::panel - Rust +panel in mcaptcha::pages::panel - Rust -

Struct mcaptcha::pages::panel::panel[][src]

pub struct panel;

Trait Implementations

impl HttpServiceFactory for panel[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/pages/routes/constant.ROUTES.html b/mcaptcha/pages/routes/constant.ROUTES.html index a55b7af1..692ac89d 100644 --- a/mcaptcha/pages/routes/constant.ROUTES.html +++ b/mcaptcha/pages/routes/constant.ROUTES.html @@ -1,5 +1,5 @@ -mcaptcha::pages::routes::ROUTES - Rust +ROUTES in mcaptcha::pages::routes - Rust -

Constant mcaptcha::pages::routes::ROUTES[][src]

pub const ROUTES: Routes;
- \ No newline at end of file +

Constant mcaptcha::pages::routes::ROUTES[][src]

pub const ROUTES: Routes;
+ \ No newline at end of file diff --git a/mcaptcha/pages/routes/index.html b/mcaptcha/pages/routes/index.html index effa9366..f9da420f 100644 --- a/mcaptcha/pages/routes/index.html +++ b/mcaptcha/pages/routes/index.html @@ -1,7 +1,7 @@ -mcaptcha::pages::routes - Rust +mcaptcha::pages::routes - Rust -

Module mcaptcha::pages::routes[][src]

Structs

+

Module mcaptcha::pages::routes[][src]

Structs

Routes

Constants

-
ROUTES
- \ No newline at end of file +
ROUTES
+ \ No newline at end of file diff --git a/mcaptcha/pages/routes/struct.Routes.html b/mcaptcha/pages/routes/struct.Routes.html index 87343b98..ace16121 100644 --- a/mcaptcha/pages/routes/struct.Routes.html +++ b/mcaptcha/pages/routes/struct.Routes.html @@ -1,123 +1,119 @@ -mcaptcha::pages::routes::Routes - Rust +Routes in mcaptcha::pages::routes - Rust -

Struct mcaptcha::pages::routes::Routes[][src]

pub struct Routes {
+

Struct mcaptcha::pages::routes::Routes[][src]

pub struct Routes {
     pub home: &'static str,
-    pub auth: Auth,
-    pub panel: Panel,
-    pub errors: Errors,
+    pub auth: Auth,
+    pub panel: Panel,
+    pub errors: Errors,
     pub about: &'static str,
     pub thanks: &'static str,
     pub donate: &'static str,
     pub security: &'static str,
     pub privacy: &'static str,
 }

- Fields

home: &'static strauth: Authpanel: Panelerrors: Errorsabout: &'static strthanks: &'static strdonate: &'static strsecurity: &'static strprivacy: &'static str

Implementations

impl Routes[src]

const fn new() -> Routes[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/routes/enum.Methods.html b/mcaptcha/routes/enum.Methods.html index e1f14bee..718b37bc 100644 --- a/mcaptcha/routes/enum.Methods.html +++ b/mcaptcha/routes/enum.Methods.html @@ -1,7 +1,7 @@ -mcaptcha::routes::Methods - Rust +Methods in mcaptcha::routes - Rust -

Enum mcaptcha::routes::Methods[][src]

pub enum Methods {
+

Enum mcaptcha::routes::Methods[][src]

pub enum Methods {
     Get,
     Post,
     ProtectGet,
@@ -12,112 +12,108 @@
 
Post

POST handler

ProtectGet

Protected GET handler

ProtectPost

Protected POST handler

-

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Auto Trait Implementations

impl RefUnwindSafe for Methods

impl Send for Methods

impl Sync for Methods

impl Unpin for Methods

impl UnwindSafe for Methods

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/routes/index.html b/mcaptcha/routes/index.html index d75e15f6..7b40aef3 100644 --- a/mcaptcha/routes/index.html +++ b/mcaptcha/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::routes - Rust +mcaptcha::routes - Rust -

Module mcaptcha::routes[][src]

Enums

-
Methods
- \ No newline at end of file +

Module mcaptcha::routes[][src]

Enums

+
Methods
+ \ No newline at end of file diff --git a/mcaptcha/settings/fn.check_url.html b/mcaptcha/settings/fn.check_url.html index d3ae3efc..2d53593c 100644 --- a/mcaptcha/settings/fn.check_url.html +++ b/mcaptcha/settings/fn.check_url.html @@ -1,5 +1,5 @@ -mcaptcha::settings::check_url - Rust +check_url in mcaptcha::settings - Rust -

Function mcaptcha::settings::check_url[][src]

fn check_url(s: &Config)
- \ No newline at end of file +

Function mcaptcha::settings::check_url[][src]

fn check_url(s: &Config)
+ \ No newline at end of file diff --git a/mcaptcha/settings/fn.set_database_url.html b/mcaptcha/settings/fn.set_database_url.html index ff128d02..a55f1802 100644 --- a/mcaptcha/settings/fn.set_database_url.html +++ b/mcaptcha/settings/fn.set_database_url.html @@ -1,5 +1,5 @@ -mcaptcha::settings::set_database_url - Rust +set_database_url in mcaptcha::settings - Rust -

Function mcaptcha::settings::set_database_url[][src]

fn set_database_url(s: &mut Config)
- \ No newline at end of file +

Function mcaptcha::settings::set_database_url[][src]

fn set_database_url(s: &mut Config)
+ \ No newline at end of file diff --git a/mcaptcha/settings/fn.set_from_database_url.html b/mcaptcha/settings/fn.set_from_database_url.html index 3fd4c421..1acae9c8 100644 --- a/mcaptcha/settings/fn.set_from_database_url.html +++ b/mcaptcha/settings/fn.set_from_database_url.html @@ -1,5 +1,5 @@ -mcaptcha::settings::set_from_database_url - Rust +set_from_database_url in mcaptcha::settings - Rust -

Function mcaptcha::settings::set_from_database_url[][src]

fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder)
- \ No newline at end of file +

Function mcaptcha::settings::set_from_database_url[][src]

fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder)
+ \ No newline at end of file diff --git a/mcaptcha/settings/index.html b/mcaptcha/settings/index.html index 9e99cf50..5f4bafca 100644 --- a/mcaptcha/settings/index.html +++ b/mcaptcha/settings/index.html @@ -1,7 +1,7 @@ -mcaptcha::settings - Rust +mcaptcha::settings - Rust -

Module mcaptcha::settings[][src]

Structs

+

Module mcaptcha::settings[][src]

Structs

Captcha
Database
DatabaseBuilder
Redis
Server
Settings
Smtp

Functions

-
check_url
set_database_url
set_from_database_url
- \ No newline at end of file +
check_url
set_database_url
set_from_database_url
+ \ No newline at end of file diff --git a/mcaptcha/settings/struct.Captcha.html b/mcaptcha/settings/struct.Captcha.html index 4c4fede2..b862913d 100644 --- a/mcaptcha/settings/struct.Captcha.html +++ b/mcaptcha/settings/struct.Captcha.html @@ -1,124 +1,120 @@ -mcaptcha::settings::Captcha - Rust +Captcha in mcaptcha::settings - Rust -

Struct mcaptcha::settings::Captcha[][src]

pub struct Captcha {
+

Struct mcaptcha::settings::Captcha[][src]

pub struct Captcha {
     pub salt: String,
     pub gc: u64,
 }

- Fields

salt: Stringgc: u64

Trait Implementations

impl Clone for Captcha[src]

impl Debug for Captcha[src]

impl<'de> Deserialize<'de> for Captcha[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/settings/struct.Database.html b/mcaptcha/settings/struct.Database.html index 76fd17fa..efb25514 100644 --- a/mcaptcha/settings/struct.Database.html +++ b/mcaptcha/settings/struct.Database.html @@ -1,124 +1,120 @@ -mcaptcha::settings::Database - Rust +Database in mcaptcha::settings - Rust -

Struct mcaptcha::settings::Database[][src]

pub struct Database {
+

Struct mcaptcha::settings::Database[][src]

pub struct Database {
     pub url: String,
     pub pool: u32,
 }

- Fields

url: Stringpool: u32

Trait Implementations

impl Clone for Database[src]

impl Debug for Database[src]

impl<'de> Deserialize<'de> for Database[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/settings/struct.DatabaseBuilder.html b/mcaptcha/settings/struct.DatabaseBuilder.html index 49ff7d83..9f5076a8 100644 --- a/mcaptcha/settings/struct.DatabaseBuilder.html +++ b/mcaptcha/settings/struct.DatabaseBuilder.html @@ -1,7 +1,7 @@ -mcaptcha::settings::DatabaseBuilder - Rust +DatabaseBuilder in mcaptcha::settings - Rust -

Struct mcaptcha::settings::DatabaseBuilder[][src]

struct DatabaseBuilder {
+

Struct mcaptcha::settings::DatabaseBuilder[][src]

struct DatabaseBuilder {
     pub port: u32,
     pub hostname: String,
     pub username: String,
@@ -9,120 +9,116 @@
     pub name: String,
     pub url: String,
 }

- Fields

port: u32hostname: Stringusername: Stringpassword: Stringname: Stringurl: String

Implementations

impl DatabaseBuilder[src]

fn extract_database_url(url: &Url) -> Self[src]

Trait Implementations

impl Clone for DatabaseBuilder[src]

impl Debug for DatabaseBuilder[src]

impl<'de> Deserialize<'de> for DatabaseBuilder[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/settings/struct.Redis.html b/mcaptcha/settings/struct.Redis.html index eb8477fe..897369fc 100644 --- a/mcaptcha/settings/struct.Redis.html +++ b/mcaptcha/settings/struct.Redis.html @@ -1,124 +1,120 @@ -mcaptcha::settings::Redis - Rust +Redis in mcaptcha::settings - Rust -

Struct mcaptcha::settings::Redis[][src]

pub struct Redis {
+

Struct mcaptcha::settings::Redis[][src]

pub struct Redis {
     pub url: String,
     pub pool: u32,
 }

- Fields

url: Stringpool: u32

Trait Implementations

impl Clone for Redis[src]

impl Debug for Redis[src]

impl<'de> Deserialize<'de> for Redis[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/settings/struct.Server.html b/mcaptcha/settings/struct.Server.html index 987606f9..daebf287 100644 --- a/mcaptcha/settings/struct.Server.html +++ b/mcaptcha/settings/struct.Server.html @@ -1,7 +1,7 @@ -mcaptcha::settings::Server - Rust +Server in mcaptcha::settings - Rust -

Struct mcaptcha::settings::Server[][src]

pub struct Server {
+

Struct mcaptcha::settings::Server[][src]

pub struct Server {
     pub allow_registration: bool,
     pub port: u32,
     pub domain: String,
@@ -9,120 +9,116 @@
     pub ip: String,
     pub url_prefix: Option<String>,
 }

- Fields

allow_registration: boolport: u32domain: Stringcookie_secret: Stringip: Stringurl_prefix: Option<String>

Implementations

impl Server[src]

pub fn get_ip(&self) -> String[src]

Trait Implementations

impl Clone for Server[src]

impl Debug for Server[src]

impl<'de> Deserialize<'de> for Server[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/settings/struct.Settings.html b/mcaptcha/settings/struct.Settings.html index 003f2f85..b4818319 100644 --- a/mcaptcha/settings/struct.Settings.html +++ b/mcaptcha/settings/struct.Settings.html @@ -1,129 +1,125 @@ -mcaptcha::settings::Settings - Rust +Settings in mcaptcha::settings - Rust -

Struct mcaptcha::settings::Settings[][src]

pub struct Settings {
+

Struct mcaptcha::settings::Settings[][src]

pub struct Settings {
     pub debug: bool,
-    pub database: Database,
-    pub redis: Option<Redis>,
-    pub server: Server,
-    pub pow: Captcha,
+    pub database: Database,
+    pub redis: Option<Redis>,
+    pub server: Server,
+    pub pow: Captcha,
     pub source_code: String,
-    pub smtp: Option<Smtp>,
+    pub smtp: Option<Smtp>,
 }

- Fields

debug: booldatabase: Databaseredis: Option<Redis>server: Serverpow: Captchasource_code: Stringsmtp: Option<Smtp>

Implementations

impl Settings[src]

pub fn new() -> Result<Self, ConfigError>[src]

Trait Implementations

impl Clone for Settings[src]

impl Debug for Settings[src]

impl<'de> Deserialize<'de> for Settings[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/settings/struct.Smtp.html b/mcaptcha/settings/struct.Smtp.html index 11091572..dbf3b1f2 100644 --- a/mcaptcha/settings/struct.Smtp.html +++ b/mcaptcha/settings/struct.Smtp.html @@ -1,126 +1,124 @@ -mcaptcha::settings::Smtp - Rust +Smtp in mcaptcha::settings - Rust -

Struct mcaptcha::settings::Smtp[][src]

pub struct Smtp {
+

Struct mcaptcha::settings::Smtp[][src]

pub struct Smtp {
     pub from: String,
+    pub reply_to: String,
     pub url: String,
     pub username: String,
     pub password: String,
+    pub port: u16,
 }

- Fields

from: Stringurl: Stringusername: Stringpassword: String

Trait Implementations

impl Clone for Smtp[src]

impl Debug for Smtp[src]

impl<'de> Deserialize<'de> for Smtp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/sidebar-items.js b/mcaptcha/sidebar-items.js index 2a822f9a..d7dbea79 100644 --- a/mcaptcha/sidebar-items.js +++ b/mcaptcha/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"constant":[["CACHE_AGE",""],["DOCS",""],["PAGES",""],["V1_API_ROUTES",""],["WIDGET_ROUTES",""]],"fn":[["get_identity_service",""],["get_json_err",""],["main",""]],"macro":[["define_resource","Defines resoures for [Methods]"]],"mod":[["api",""],["data","App data: redis cache, database connections, etc."],["docs",""],["errors",""],["middleware",""],["pages",""],["routes",""],["settings",""],["static_assets",""],["stats",""],["widget",""]],"static":[["GIT_COMMIT_HASH",""],["OPEN_API_DOC",""],["PKG_DESCRIPTION",""],["PKG_HOMEPAGE",""],["PKG_NAME",""],["VERSION",""]],"struct":[["CSS",""],["CheckLogin",""],["Data","App data"],["FILES",""],["JS",""],["MOBILE_CSS",""],["SETTINGS",""],["SOURCE_FILES_OF_INSTANCE","points to source files matching build commit"],["Settings",""],["VERIFICATIN_WIDGET_CSS",""],["VERIFICATIN_WIDGET_JS",""]],"type":[["AppData",""]]}); \ No newline at end of file +initSidebarItems({"constant":[["CACHE_AGE",""],["DOCS",""],["PAGES",""],["V1_API_ROUTES",""],["WIDGET_ROUTES",""]],"fn":[["get_identity_service",""],["get_json_err",""],["main",""]],"macro":[["define_resource","Defines resoures for [Methods]"]],"mod":[["api",""],["data","App data: redis cache, database connections, etc."],["docs",""],["email",""],["errors",""],["middleware",""],["pages",""],["routes",""],["settings",""],["static_assets",""],["stats",""],["widget",""]],"static":[["GIT_COMMIT_HASH",""],["OPEN_API_DOC",""],["PKG_DESCRIPTION",""],["PKG_HOMEPAGE",""],["PKG_NAME",""],["VERSION",""]],"struct":[["CSS",""],["CheckLogin",""],["Data","App data"],["FILES",""],["JS",""],["MOBILE_CSS",""],["SETTINGS",""],["SOURCE_FILES_OF_INSTANCE","points to source files matching build commit"],["Settings",""],["VERIFICATIN_WIDGET_CSS",""],["VERIFICATIN_WIDGET_JS",""]],"type":[["AppData",""]]}); \ No newline at end of file diff --git a/mcaptcha/static.GIT_COMMIT_HASH.html b/mcaptcha/static.GIT_COMMIT_HASH.html index 07b42323..9bdfb081 100644 --- a/mcaptcha/static.GIT_COMMIT_HASH.html +++ b/mcaptcha/static.GIT_COMMIT_HASH.html @@ -1,5 +1,5 @@ -mcaptcha::GIT_COMMIT_HASH - Rust +GIT_COMMIT_HASH in mcaptcha - Rust -

Static mcaptcha::GIT_COMMIT_HASH[][src]

pub static GIT_COMMIT_HASH: &str
- \ No newline at end of file +

Static mcaptcha::GIT_COMMIT_HASH[][src]

pub static GIT_COMMIT_HASH: &str
+ \ No newline at end of file diff --git a/mcaptcha/static.OPEN_API_DOC.html b/mcaptcha/static.OPEN_API_DOC.html index 0c040800..8f5b52bf 100644 --- a/mcaptcha/static.OPEN_API_DOC.html +++ b/mcaptcha/static.OPEN_API_DOC.html @@ -1,5 +1,5 @@ -mcaptcha::OPEN_API_DOC - Rust +OPEN_API_DOC in mcaptcha - Rust -

Static mcaptcha::OPEN_API_DOC[][src]

pub static OPEN_API_DOC: &str
- \ No newline at end of file +

Static mcaptcha::OPEN_API_DOC[][src]

pub static OPEN_API_DOC: &str
+ \ No newline at end of file diff --git a/mcaptcha/static.PKG_DESCRIPTION.html b/mcaptcha/static.PKG_DESCRIPTION.html index 7c6ac87a..0ee8919a 100644 --- a/mcaptcha/static.PKG_DESCRIPTION.html +++ b/mcaptcha/static.PKG_DESCRIPTION.html @@ -1,5 +1,5 @@ -mcaptcha::PKG_DESCRIPTION - Rust +PKG_DESCRIPTION in mcaptcha - Rust -

Static mcaptcha::PKG_DESCRIPTION[][src]

pub static PKG_DESCRIPTION: &str
- \ No newline at end of file +

Static mcaptcha::PKG_DESCRIPTION[][src]

pub static PKG_DESCRIPTION: &str
+ \ No newline at end of file diff --git a/mcaptcha/static.PKG_HOMEPAGE.html b/mcaptcha/static.PKG_HOMEPAGE.html index df9a0c25..fa7ec29a 100644 --- a/mcaptcha/static.PKG_HOMEPAGE.html +++ b/mcaptcha/static.PKG_HOMEPAGE.html @@ -1,5 +1,5 @@ -mcaptcha::PKG_HOMEPAGE - Rust +PKG_HOMEPAGE in mcaptcha - Rust -

Static mcaptcha::PKG_HOMEPAGE[][src]

pub static PKG_HOMEPAGE: &str
- \ No newline at end of file +

Static mcaptcha::PKG_HOMEPAGE[][src]

pub static PKG_HOMEPAGE: &str
+ \ No newline at end of file diff --git a/mcaptcha/static.PKG_NAME.html b/mcaptcha/static.PKG_NAME.html index 89c87b9a..04efb8c0 100644 --- a/mcaptcha/static.PKG_NAME.html +++ b/mcaptcha/static.PKG_NAME.html @@ -1,5 +1,5 @@ -mcaptcha::PKG_NAME - Rust +PKG_NAME in mcaptcha - Rust -

Static mcaptcha::PKG_NAME[][src]

pub static PKG_NAME: &str
- \ No newline at end of file +

Static mcaptcha::PKG_NAME[][src]

pub static PKG_NAME: &str
+ \ No newline at end of file diff --git a/mcaptcha/static.VERSION.html b/mcaptcha/static.VERSION.html index 30c13654..acd5c033 100644 --- a/mcaptcha/static.VERSION.html +++ b/mcaptcha/static.VERSION.html @@ -1,5 +1,5 @@ -mcaptcha::VERSION - Rust +VERSION in mcaptcha - Rust -

Static mcaptcha::VERSION[][src]

pub static VERSION: &str
- \ No newline at end of file +

Static mcaptcha::VERSION[][src]

pub static VERSION: &str
+ \ No newline at end of file diff --git a/mcaptcha/static_assets/filemap/index.html b/mcaptcha/static_assets/filemap/index.html index 6634f1ac..a4d5e741 100644 --- a/mcaptcha/static_assets/filemap/index.html +++ b/mcaptcha/static_assets/filemap/index.html @@ -1,6 +1,6 @@ -mcaptcha::static_assets::filemap - Rust +mcaptcha::static_assets::filemap - Rust -

Module mcaptcha::static_assets::filemap[][src]

Structs

-
FileMap
- \ No newline at end of file +

Module mcaptcha::static_assets::filemap[][src]

Structs

+
FileMap
+ \ No newline at end of file diff --git a/mcaptcha/static_assets/filemap/struct.FileMap.html b/mcaptcha/static_assets/filemap/struct.FileMap.html index 54628e58..bff62906 100644 --- a/mcaptcha/static_assets/filemap/struct.FileMap.html +++ b/mcaptcha/static_assets/filemap/struct.FileMap.html @@ -1,115 +1,111 @@ -mcaptcha::static_assets::filemap::FileMap - Rust +FileMap in mcaptcha::static_assets::filemap - Rust -

Struct mcaptcha::static_assets::filemap::FileMap[][src]

pub struct FileMap {
+

Struct mcaptcha::static_assets::filemap::FileMap[][src]

pub struct FileMap {
     pub files: Files,
 }

- Fields

files: Files

Implementations

impl FileMap[src]

pub fn new() -> Self[src]

pub fn get<'a>(&'a self, path: &'a str) -> Option<&'a str>[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/static_assets/fn.services.html b/mcaptcha/static_assets/fn.services.html index 06d30c4b..11799360 100644 --- a/mcaptcha/static_assets/fn.services.html +++ b/mcaptcha/static_assets/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::static_assets::services - Rust +services in mcaptcha::static_assets - Rust -

Function mcaptcha::static_assets::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::static_assets::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/static_assets/index.html b/mcaptcha/static_assets/index.html index 1e6569d0..e1b64770 100644 --- a/mcaptcha/static_assets/index.html +++ b/mcaptcha/static_assets/index.html @@ -1,8 +1,8 @@ -mcaptcha::static_assets - Rust +mcaptcha::static_assets - Rust -

Module mcaptcha::static_assets[][src]

Re-exports

-
pub use filemap::FileMap;

Modules

+

Module mcaptcha::static_assets[][src]

Re-exports

+
pub use filemap::FileMap;

Modules

filemap
static_files

Functions

-
services
- \ No newline at end of file +
services
+ \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/fn.handle_assets.html b/mcaptcha/static_assets/static_files/fn.handle_assets.html index 03eefd09..0ec63dcf 100644 --- a/mcaptcha/static_assets/static_files/fn.handle_assets.html +++ b/mcaptcha/static_assets/static_files/fn.handle_assets.html @@ -1,5 +1,5 @@ -mcaptcha::static_assets::static_files::handle_assets - Rust +handle_assets in mcaptcha::static_assets::static_files - Rust -

Function mcaptcha::static_assets::static_files::handle_assets[][src]

fn handle_assets(path: &str) -> HttpResponse
- \ No newline at end of file +

Function mcaptcha::static_assets::static_files::handle_assets[][src]

fn handle_assets(path: &str) -> HttpResponse
+ \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/fn.handle_favicons.html b/mcaptcha/static_assets/static_files/fn.handle_favicons.html index 2da82d3b..28f4b401 100644 --- a/mcaptcha/static_assets/static_files/fn.handle_favicons.html +++ b/mcaptcha/static_assets/static_files/fn.handle_favicons.html @@ -1,5 +1,5 @@ -mcaptcha::static_assets::static_files::handle_favicons - Rust +handle_favicons in mcaptcha::static_assets::static_files - Rust -

Function mcaptcha::static_assets::static_files::handle_favicons[][src]

fn handle_favicons(path: &str) -> HttpResponse
- \ No newline at end of file +

Function mcaptcha::static_assets::static_files::handle_favicons[][src]

fn handle_favicons(path: &str) -> HttpResponse
+ \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/index.html b/mcaptcha/static_assets/static_files/index.html index 0b2088a5..4a8930b0 100644 --- a/mcaptcha/static_assets/static_files/index.html +++ b/mcaptcha/static_assets/static_files/index.html @@ -1,7 +1,7 @@ -mcaptcha::static_assets::static_files - Rust +mcaptcha::static_assets::static_files - Rust -

Module mcaptcha::static_assets::static_files[][src]

Structs

+

Module mcaptcha::static_assets::static_files[][src]

Structs

Asset
Favicons
favicons
static_files

Functions

-
handle_assets
handle_favicons
- \ No newline at end of file +
handle_assets
handle_favicons
+ \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/struct.Asset.html b/mcaptcha/static_assets/static_files/struct.Asset.html index a20e4cc0..97bd640e 100644 --- a/mcaptcha/static_assets/static_files/struct.Asset.html +++ b/mcaptcha/static_assets/static_files/struct.Asset.html @@ -1,114 +1,110 @@ -mcaptcha::static_assets::static_files::Asset - Rust +Asset in mcaptcha::static_assets::static_files - Rust -

Struct mcaptcha::static_assets::static_files::Asset[][src]

struct Asset;

Implementations

impl Asset[src]

pub fn get(file_path: &str) -> Option<Cow<'static, [u8]>>[src]

pub fn iter() -> impl Iterator<Item = Cow<'static, str>>[src]

Trait Implementations

impl RustEmbed for Asset[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/struct.Favicons.html b/mcaptcha/static_assets/static_files/struct.Favicons.html index 3f7ab0ff..6627240f 100644 --- a/mcaptcha/static_assets/static_files/struct.Favicons.html +++ b/mcaptcha/static_assets/static_files/struct.Favicons.html @@ -1,114 +1,110 @@ -mcaptcha::static_assets::static_files::Favicons - Rust +Favicons in mcaptcha::static_assets::static_files - Rust -

Struct mcaptcha::static_assets::static_files::Favicons[][src]

struct Favicons;

Implementations

impl Favicons[src]

pub fn get(file_path: &str) -> Option<Cow<'static, [u8]>>[src]

pub fn iter() -> impl Iterator<Item = Cow<'static, str>>[src]

Trait Implementations

impl RustEmbed for Favicons[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/struct.favicons.html b/mcaptcha/static_assets/static_files/struct.favicons.html index 273df9c8..a7456868 100644 --- a/mcaptcha/static_assets/static_files/struct.favicons.html +++ b/mcaptcha/static_assets/static_files/struct.favicons.html @@ -1,112 +1,108 @@ -mcaptcha::static_assets::static_files::favicons - Rust +favicons in mcaptcha::static_assets::static_files - Rust -

Struct mcaptcha::static_assets::static_files::favicons[][src]

pub struct favicons;

Trait Implementations

impl HttpServiceFactory for favicons[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/struct.static_files.html b/mcaptcha/static_assets/static_files/struct.static_files.html index 8e350a6c..5173d8d9 100644 --- a/mcaptcha/static_assets/static_files/struct.static_files.html +++ b/mcaptcha/static_assets/static_files/struct.static_files.html @@ -1,112 +1,108 @@ -mcaptcha::static_assets::static_files::static_files - Rust +static_files in mcaptcha::static_assets::static_files - Rust -

Struct mcaptcha::static_assets::static_files::static_files[][src]

pub struct static_files;

Trait Implementations

impl HttpServiceFactory for static_files[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/stats/fetch/index.html b/mcaptcha/stats/fetch/index.html index d26ce556..eb2f2ed9 100644 --- a/mcaptcha/stats/fetch/index.html +++ b/mcaptcha/stats/fetch/index.html @@ -1,6 +1,6 @@ -mcaptcha::stats::fetch - Rust +mcaptcha::stats::fetch - Rust -

Module mcaptcha::stats::fetch[][src]

Structs

-
Stats
- \ No newline at end of file +

Module mcaptcha::stats::fetch[][src]

Structs

+
Stats
+ \ No newline at end of file diff --git a/mcaptcha/stats/fetch/struct.Stats.html b/mcaptcha/stats/fetch/struct.Stats.html index 6de9bd4c..6115d5c5 100644 --- a/mcaptcha/stats/fetch/struct.Stats.html +++ b/mcaptcha/stats/fetch/struct.Stats.html @@ -1,129 +1,125 @@ -mcaptcha::stats::fetch::Stats - Rust +Stats in mcaptcha::stats::fetch - Rust -

Struct mcaptcha::stats::fetch::Stats[][src]

pub struct Stats {
+

Struct mcaptcha::stats::fetch::Stats[][src]

pub struct Stats {
     pub config_fetches: Vec<i64>,
     pub solves: Vec<i64>,
     pub confirms: Vec<i64>,
 }

- Fields

config_fetches: Vec<i64>solves: Vec<i64>confirms: Vec<i64>

Implementations

impl Stats[src]

pub async fn new(key: &str, db: &PgPool) -> Result<Self, ServiceError>[src]

pub async fn fetch_config_fetched(
    key: &str,
    db: &PgPool
) -> Result<Vec<i64>, ServiceError>
[src]

featch PoWConfig fetches

-

pub async fn fetch_solve(
    key: &str,
    db: &PgPool
) -> Result<Vec<i64>, ServiceError>
[src]

featch PoWConfig solves

-

pub async fn fetch_confirm(
    key: &str,
    db: &PgPool
) -> Result<Vec<i64>, ServiceError>
[src]

featch PoWConfig confirms

-

Trait Implementations

impl Clone for Stats[src]

impl Debug for Stats[src]

impl<'de> Deserialize<'de> for Stats[src]

impl Serialize for Stats[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/stats/index.html b/mcaptcha/stats/index.html index 7e099b6e..89bb41b1 100644 --- a/mcaptcha/stats/index.html +++ b/mcaptcha/stats/index.html @@ -1,6 +1,6 @@ -mcaptcha::stats - Rust +mcaptcha::stats - Rust -

Module mcaptcha::stats[][src]

Modules

-
fetch
record
- \ No newline at end of file +

Module mcaptcha::stats[][src]

Modules

+
fetch
record
+ \ No newline at end of file diff --git a/mcaptcha/stats/record/fn.record_confirm.html b/mcaptcha/stats/record/fn.record_confirm.html index 23f75f73..4f76d732 100644 --- a/mcaptcha/stats/record/fn.record_confirm.html +++ b/mcaptcha/stats/record/fn.record_confirm.html @@ -1,6 +1,6 @@ -mcaptcha::stats::record::record_confirm - Rust +record_confirm in mcaptcha::stats::record - Rust -

Function mcaptcha::stats::record::record_confirm[][src]

pub async fn record_confirm(key: &str, db: &PgPool)

record PoWConfig confirms

-
- \ No newline at end of file +

Function mcaptcha::stats::record::record_confirm[][src]

pub async fn record_confirm(key: &str, db: &PgPool)

record PoWConfig confirms

+
+ \ No newline at end of file diff --git a/mcaptcha/stats/record/fn.record_fetch.html b/mcaptcha/stats/record/fn.record_fetch.html index 4029f51c..f6e2c037 100644 --- a/mcaptcha/stats/record/fn.record_fetch.html +++ b/mcaptcha/stats/record/fn.record_fetch.html @@ -1,6 +1,6 @@ -mcaptcha::stats::record::record_fetch - Rust +record_fetch in mcaptcha::stats::record - Rust -

Function mcaptcha::stats::record::record_fetch[][src]

pub async fn record_fetch(key: &str, db: &PgPool)

record PoWConfig fetches

-
- \ No newline at end of file +

Function mcaptcha::stats::record::record_fetch[][src]

pub async fn record_fetch(key: &str, db: &PgPool)

record PoWConfig fetches

+
+ \ No newline at end of file diff --git a/mcaptcha/stats/record/fn.record_solve.html b/mcaptcha/stats/record/fn.record_solve.html index f15558da..4f8e7877 100644 --- a/mcaptcha/stats/record/fn.record_solve.html +++ b/mcaptcha/stats/record/fn.record_solve.html @@ -1,6 +1,6 @@ -mcaptcha::stats::record::record_solve - Rust +record_solve in mcaptcha::stats::record - Rust -

Function mcaptcha::stats::record::record_solve[][src]

pub async fn record_solve(key: &str, db: &PgPool)

record PoWConfig solves

-
- \ No newline at end of file +

Function mcaptcha::stats::record::record_solve[][src]

pub async fn record_solve(key: &str, db: &PgPool)

record PoWConfig solves

+
+ \ No newline at end of file diff --git a/mcaptcha/stats/record/index.html b/mcaptcha/stats/record/index.html index effa81e2..e0c20bd5 100644 --- a/mcaptcha/stats/record/index.html +++ b/mcaptcha/stats/record/index.html @@ -1,9 +1,9 @@ -mcaptcha::stats::record - Rust +mcaptcha::stats::record - Rust -

Module mcaptcha::stats::record[][src]

Functions

+

Module mcaptcha::stats::record[][src]

Functions

record_confirm

record PoWConfig confirms

record_fetch

record PoWConfig fetches

record_solve

record PoWConfig solves

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/mcaptcha/struct.CSS.html b/mcaptcha/struct.CSS.html index 663b8a70..9b174992 100644 --- a/mcaptcha/struct.CSS.html +++ b/mcaptcha/struct.CSS.html @@ -1,1369 +1,113 @@ -mcaptcha::CSS - Rust +CSS in mcaptcha - Rust -

Struct mcaptcha::CSS[][src]

pub struct CSS {
+

Struct mcaptcha::CSS[][src]

pub struct CSS {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = &'static str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for CSS[src]

type Target = &'static str

The resulting type after dereferencing.

-

impl LazyStatic for CSS[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.CheckLogin.html b/mcaptcha/struct.CheckLogin.html index 7bacf5b3..255b015a 100644 --- a/mcaptcha/struct.CheckLogin.html +++ b/mcaptcha/struct.CheckLogin.html @@ -1,121 +1,114 @@ -mcaptcha::CheckLogin - Rust +CheckLogin in mcaptcha - Rust -

Struct mcaptcha::CheckLogin[][src]

pub struct CheckLogin;

Trait Implementations

impl<S, B> Transform<S> for CheckLogin where
    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
    S::Future: 'static, 
[src]

type Request = ServiceRequest

Requests handled by the service.

-

type Response = ServiceResponse<B>

Responses given by the service.

-

type Error = Error

Errors produced by the service.

-

type Transform = CheckLoginMiddleware<S>

The TransformService value created by this factory

-

type InitError = ()

Errors produced while building a transform service.

-

type Future = Ready<Result<Self::Transform, Self::InitError>>

The future response value.

-

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.Data.html b/mcaptcha/struct.Data.html index 86ad94a7..6730f5eb 100644 --- a/mcaptcha/struct.Data.html +++ b/mcaptcha/struct.Data.html @@ -1,124 +1,120 @@ -mcaptcha::Data - Rust +Data in mcaptcha - Rust -

Struct mcaptcha::Data[][src]

pub struct Data {
+

Struct mcaptcha::Data[][src]

pub struct Data {
     pub db: PgPool,
     pub creds: Config,
-    pub captcha: SystemGroup,
+    pub captcha: SystemGroup,
     pub mailer: Option<AsyncSmtpTransport<Tokio1Executor>>,
 }

App data

Fields

db: PgPool

databse pool

creds: Config

credential management configuration

-
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

+
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

mailer: Option<AsyncSmtpTransport<Tokio1Executor>>

email client

-

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

-

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

+

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

impl !RefUnwindSafe for Data

impl Send for Data

impl Sync for Data

impl Unpin for Data

impl !UnwindSafe for Data

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.FILES.html b/mcaptcha/struct.FILES.html index 30732a21..8723c9ca 100644 --- a/mcaptcha/struct.FILES.html +++ b/mcaptcha/struct.FILES.html @@ -1,117 +1,113 @@ -mcaptcha::FILES - Rust +FILES in mcaptcha - Rust -

Struct mcaptcha::FILES[][src]

pub struct FILES {
+

Struct mcaptcha::FILES[][src]

pub struct FILES {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = FileMap>

pub fn get<'a>(&'a self, path: &'a str) -> Option<&'a str>[src]

Trait Implementations

impl Deref for FILES[src]

type Target = FileMap

The resulting type after dereferencing.

-

impl LazyStatic for FILES[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.JS.html b/mcaptcha/struct.JS.html index 7b89ff55..a4041002 100644 --- a/mcaptcha/struct.JS.html +++ b/mcaptcha/struct.JS.html @@ -1,1369 +1,113 @@ -mcaptcha::JS - Rust +JS in mcaptcha - Rust -

Struct mcaptcha::JS[][src]

pub struct JS {
+

Struct mcaptcha::JS[][src]

pub struct JS {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = &'static str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for JS[src]

type Target = &'static str

The resulting type after dereferencing.

-

impl LazyStatic for JS[src]

Auto Trait Implementations

impl RefUnwindSafe for JS[src]

impl Send for JS[src]

impl Sync for JS[src]

impl Unpin for JS[src]

impl UnwindSafe for JS[src]

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.MOBILE_CSS.html b/mcaptcha/struct.MOBILE_CSS.html index 6a19aae4..adc12efe 100644 --- a/mcaptcha/struct.MOBILE_CSS.html +++ b/mcaptcha/struct.MOBILE_CSS.html @@ -1,1369 +1,113 @@ -mcaptcha::MOBILE_CSS - Rust +MOBILE_CSS in mcaptcha - Rust -

Struct mcaptcha::MOBILE_CSS[][src]

pub struct MOBILE_CSS {
+

Struct mcaptcha::MOBILE_CSS[][src]

pub struct MOBILE_CSS {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = &'static str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for MOBILE_CSS[src]

type Target = &'static str

The resulting type after dereferencing.

-

impl LazyStatic for MOBILE_CSS[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.SETTINGS.html b/mcaptcha/struct.SETTINGS.html index 8e4601c0..c845b4cd 100644 --- a/mcaptcha/struct.SETTINGS.html +++ b/mcaptcha/struct.SETTINGS.html @@ -1,117 +1,113 @@ -mcaptcha::SETTINGS - Rust +SETTINGS in mcaptcha - Rust -

Struct mcaptcha::SETTINGS[][src]

pub struct SETTINGS {
+

Struct mcaptcha::SETTINGS[][src]

pub struct SETTINGS {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = Settings>

Trait Implementations

impl Deref for SETTINGS[src]

type Target = Settings

The resulting type after dereferencing.

-

impl LazyStatic for SETTINGS[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.SOURCE_FILES_OF_INSTANCE.html b/mcaptcha/struct.SOURCE_FILES_OF_INSTANCE.html index fdf4698f..e61e458f 100644 --- a/mcaptcha/struct.SOURCE_FILES_OF_INSTANCE.html +++ b/mcaptcha/struct.SOURCE_FILES_OF_INSTANCE.html @@ -1,1556 +1,162 @@ -mcaptcha::SOURCE_FILES_OF_INSTANCE - Rust +SOURCE_FILES_OF_INSTANCE in mcaptcha - Rust -

Struct mcaptcha::SOURCE_FILES_OF_INSTANCE[][src]

pub struct SOURCE_FILES_OF_INSTANCE {
+

Struct mcaptcha::SOURCE_FILES_OF_INSTANCE[][src]

pub struct SOURCE_FILES_OF_INSTANCE {
     __private_field: (),
 }

points to source files matching build commit

- Fields

__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

+ Fields__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

Examples

Basic usage:

-let s = String::from("foo");
+let s = String::from("foo");
 
-assert_eq!("foo", s.as_str());
-

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String's capacity, in bytes.

+assert_eq!("foo", s.as_str());
+

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String’s capacity, in bytes.

Examples

Basic usage:

-let s = String::with_capacity(10);
+let s = String::with_capacity(10);
 
-assert!(s.capacity() >= 10);
-

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String's contents.

+assert!(s.capacity() >= 10);
+

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String’s contents.

The inverse of this method is from_utf8.

Examples

Basic usage:

-let s = String::from("hello");
+let s = String::from("hello");
 
-assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
-

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or +assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());

+

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

-let a = String::from("foo");
-assert_eq!(a.len(), 3);
+let a = String::from("foo");
+assert_eq!(a.len(), 3);
 
-let fancy_f = String::from("ƒoo");
-assert_eq!(fancy_f.len(), 4);
-assert_eq!(fancy_f.chars().count(), 3);
-

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

+let fancy_f = String::from("ƒoo"); +assert_eq!(fancy_f.len(), 4); +assert_eq!(fancy_f.chars().count(), 3);
+

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

Examples

Basic usage:

-let mut v = String::new();
-assert!(v.is_empty());
+let mut v = String::new();
+assert!(v.is_empty());
 
 v.push('a');
-assert!(!v.is_empty());
-

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]1.20.0[src]

Converts a mutable string slice to a mutable byte slice.

-

Safety

-

The caller must ensure that the content of the slice is valid UTF-8 -before the borrow ends and the underlying str is used.

-

Use of a str whose contents are not valid UTF-8 is undefined behavior.

-

Examples

-

Basic usage:

- -
-let mut s = String::from("Hello");
-let bytes = unsafe { s.as_bytes_mut() };
-
-assert_eq!(b"Hello", bytes);
-

Mutability:

- -
-let mut s = String::from("🗻∈🌏");
-
-unsafe {
-    let bytes = s.as_bytes_mut();
-
-    bytes[0] = 0xF0;
-    bytes[1] = 0x9F;
-    bytes[2] = 0x8D;
-    bytes[3] = 0x94;
-}
-
-assert_eq!("🍔∈🌏", s);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn as_mut_ptr(&mut self) -> *mut u81.36.0[src]

Converts a mutable string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

It is your responsibility to make sure that the string slice only gets -modified in a way that it remains valid UTF-8.

-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub fn get_mut<I>(
    &mut self,
    i: I
) -> Option<&mut <I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let mut v = String::from("hello");
-// correct length
-assert!(v.get_mut(0..5).is_some());
-// out of bounds
-assert!(v.get_mut(..42).is_none());
-assert_eq!(Some("he"), v.get_mut(0..2).map(|v| &*v));
-
-assert_eq!("hello", v);
-{
-    let s = v.get_mut(0..2);
-    let s = s.map(|s| {
-        s.make_ascii_uppercase();
-        &*s
-    });
-    assert_eq!(Some("HE"), s);
-}
-assert_eq!("HEllo", v);
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn get_unchecked_mut<I>(
    &mut self,
    i: I
) -> &mut <I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable, unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let mut v = String::from("🗻∈🌏");
-unsafe {
-    assert_eq!("🗻", v.get_unchecked_mut(0..4));
-    assert_eq!("∈", v.get_unchecked_mut(4..7));
-    assert_eq!("🌏", v.get_unchecked_mut(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub unsafe fn slice_mut_unchecked(
    &mut self,
    begin: usize,
    end: usize
) -> &mut str
1.5.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked_mut(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks. -This is generally not recommended, use with caution! For a safe -alternative see str and IndexMut.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get an immutable string slice instead, see the -slice_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)1.4.0[src]

Divide one mutable string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get immutable string slices instead, see the split_at method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let mut s = "Per Martin-Löf".to_string();
-{
-    let (first, last) = s.split_at_mut(3);
-    first.make_ascii_uppercase();
-    assert_eq!("PER", first);
-    assert_eq!(" Martin-Löf", last);
-}
-assert_eq!("PER Martin-Löf", s);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn make_ascii_uppercase(&mut self)1.23.0[src]

Converts this string to its ASCII upper case equivalent in-place.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase().

-

Examples

-
-let mut s = String::from("Grüße, Jürgen ❤");
-
-s.make_ascii_uppercase();
-
-assert_eq!("GRüßE, JüRGEN ❤", s);
-

pub fn make_ascii_lowercase(&mut self)1.23.0[src]

Converts this string to its ASCII lower case equivalent in-place.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase().

-

Examples

-
-let mut s = String::from("GRÜßE, JÜRGEN ❤");
-
-s.make_ascii_lowercase();
-
-assert_eq!("grÜße, jÜrgen ❤", s);
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for SOURCE_FILES_OF_INSTANCE[src]

type Target = String

The resulting type after dereferencing.

-

impl LazyStatic for SOURCE_FILES_OF_INSTANCE[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

+

Trait Implementations

impl Deref for SOURCE_FILES_OF_INSTANCE[src]

type Target = String

The resulting type after dereferencing.

+

impl LazyStatic for SOURCE_FILES_OF_INSTANCE[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.Settings.html b/mcaptcha/struct.Settings.html index cf4c8339..bd314778 100644 --- a/mcaptcha/struct.Settings.html +++ b/mcaptcha/struct.Settings.html @@ -1,129 +1,125 @@ -mcaptcha::Settings - Rust +Settings in mcaptcha - Rust -

Struct mcaptcha::Settings[][src]

pub struct Settings {
+

Struct mcaptcha::Settings[][src]

pub struct Settings {
     pub debug: bool,
-    pub database: Database,
-    pub redis: Option<Redis>,
-    pub server: Server,
-    pub pow: Captcha,
+    pub database: Database,
+    pub redis: Option<Redis>,
+    pub server: Server,
+    pub pow: Captcha,
     pub source_code: String,
-    pub smtp: Option<Smtp>,
+    pub smtp: Option<Smtp>,
 }

- Fields

debug: booldatabase: Databaseredis: Option<Redis>server: Serverpow: Captchasource_code: Stringsmtp: Option<Smtp>

Implementations

impl Settings[src]

pub fn new() -> Result<Self, ConfigError>[src]

Trait Implementations

impl Clone for Settings[src]

impl Debug for Settings[src]

impl<'de> Deserialize<'de> for Settings[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/mcaptcha/struct.VERIFICATIN_WIDGET_CSS.html b/mcaptcha/struct.VERIFICATIN_WIDGET_CSS.html index 2c4922a1..8ac40c27 100644 --- a/mcaptcha/struct.VERIFICATIN_WIDGET_CSS.html +++ b/mcaptcha/struct.VERIFICATIN_WIDGET_CSS.html @@ -1,1369 +1,113 @@ -mcaptcha::VERIFICATIN_WIDGET_CSS - Rust +VERIFICATIN_WIDGET_CSS in mcaptcha - Rust -

Struct mcaptcha::VERIFICATIN_WIDGET_CSS[][src]

pub struct VERIFICATIN_WIDGET_CSS {
+

Struct mcaptcha::VERIFICATIN_WIDGET_CSS[][src]

pub struct VERIFICATIN_WIDGET_CSS {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = &'static str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for VERIFICATIN_WIDGET_CSS[src]

type Target = &'static str

The resulting type after dereferencing.

-

impl LazyStatic for VERIFICATIN_WIDGET_CSS[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/struct.VERIFICATIN_WIDGET_JS.html b/mcaptcha/struct.VERIFICATIN_WIDGET_JS.html index 8765dc02..1064d6e0 100644 --- a/mcaptcha/struct.VERIFICATIN_WIDGET_JS.html +++ b/mcaptcha/struct.VERIFICATIN_WIDGET_JS.html @@ -1,1369 +1,113 @@ -mcaptcha::VERIFICATIN_WIDGET_JS - Rust +VERIFICATIN_WIDGET_JS in mcaptcha - Rust -

Struct mcaptcha::VERIFICATIN_WIDGET_JS[][src]

pub struct VERIFICATIN_WIDGET_JS {
+

Struct mcaptcha::VERIFICATIN_WIDGET_JS[][src]

pub struct VERIFICATIN_WIDGET_JS {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = &'static str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for VERIFICATIN_WIDGET_JS[src]

type Target = &'static str

The resulting type after dereferencing.

-

impl LazyStatic for VERIFICATIN_WIDGET_JS[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/type.AppData.html b/mcaptcha/type.AppData.html index ca9a6d59..85885368 100644 --- a/mcaptcha/type.AppData.html +++ b/mcaptcha/type.AppData.html @@ -1,5 +1,5 @@ -mcaptcha::AppData - Rust +AppData in mcaptcha - Rust -

Type Definition mcaptcha::AppData[][src]

type AppData = Data<Arc<Data>>;
- \ No newline at end of file +

Type Definition mcaptcha::AppData[][src]

type AppData = Data<Arc<Data>>;
+ \ No newline at end of file diff --git a/mcaptcha/widget/constant.PAGE.html b/mcaptcha/widget/constant.PAGE.html index 10e32d6c..5eed6578 100644 --- a/mcaptcha/widget/constant.PAGE.html +++ b/mcaptcha/widget/constant.PAGE.html @@ -1,5 +1,5 @@ -mcaptcha::widget::PAGE - Rust +PAGE in mcaptcha::widget - Rust -

Constant mcaptcha::widget::PAGE[][src]

const PAGE: &str = "mCaptcha CAPTCHA verification";
- \ No newline at end of file +

Constant mcaptcha::widget::PAGE[][src]

const PAGE: &str = "mCaptcha CAPTCHA verification";
+ \ No newline at end of file diff --git a/mcaptcha/widget/constant.WIDGET_ROUTES.html b/mcaptcha/widget/constant.WIDGET_ROUTES.html index 02ad7971..ec1134a6 100644 --- a/mcaptcha/widget/constant.WIDGET_ROUTES.html +++ b/mcaptcha/widget/constant.WIDGET_ROUTES.html @@ -1,5 +1,5 @@ -mcaptcha::widget::WIDGET_ROUTES - Rust +WIDGET_ROUTES in mcaptcha::widget - Rust -

Constant mcaptcha::widget::WIDGET_ROUTES[][src]

pub const WIDGET_ROUTES: Widget;
- \ No newline at end of file +

Constant mcaptcha::widget::WIDGET_ROUTES[][src]

pub const WIDGET_ROUTES: Widget;
+ \ No newline at end of file diff --git a/mcaptcha/widget/fn.handle_widget_assets.html b/mcaptcha/widget/fn.handle_widget_assets.html index 848fdd7a..a7b6fc4c 100644 --- a/mcaptcha/widget/fn.handle_widget_assets.html +++ b/mcaptcha/widget/fn.handle_widget_assets.html @@ -1,5 +1,5 @@ -mcaptcha::widget::handle_widget_assets - Rust +handle_widget_assets in mcaptcha::widget - Rust -

Function mcaptcha::widget::handle_widget_assets[][src]

fn handle_widget_assets(path: &str) -> HttpResponse
- \ No newline at end of file +

Function mcaptcha::widget::handle_widget_assets[][src]

fn handle_widget_assets(path: &str) -> HttpResponse
+ \ No newline at end of file diff --git a/mcaptcha/widget/fn.services.html b/mcaptcha/widget/fn.services.html index b1e043f0..616659fe 100644 --- a/mcaptcha/widget/fn.services.html +++ b/mcaptcha/widget/fn.services.html @@ -1,5 +1,5 @@ -mcaptcha::widget::services - Rust +services in mcaptcha::widget - Rust -

Function mcaptcha::widget::services[][src]

pub fn services(cfg: &mut ServiceConfig)
- \ No newline at end of file +

Function mcaptcha::widget::services[][src]

pub fn services(cfg: &mut ServiceConfig)
+ \ No newline at end of file diff --git a/mcaptcha/widget/index.html b/mcaptcha/widget/index.html index 02541d1b..7fbe8e6d 100644 --- a/mcaptcha/widget/index.html +++ b/mcaptcha/widget/index.html @@ -1,10 +1,10 @@ -mcaptcha::widget - Rust +mcaptcha::widget - Rust -

Module mcaptcha::widget[][src]

Modules

+

Module mcaptcha::widget[][src]

Modules

routes

Structs

INDEX_PAGE
IndexPage
WidgetAssets
show_widget

render a client side widget for CAPTCHA verification

widget_assets

Constants

PAGE
WIDGET_ROUTES

Functions

-
handle_widget_assets
services
- \ No newline at end of file +
handle_widget_assets
services
+ \ No newline at end of file diff --git a/mcaptcha/widget/routes/index.html b/mcaptcha/widget/routes/index.html index 7c749aad..333adac2 100644 --- a/mcaptcha/widget/routes/index.html +++ b/mcaptcha/widget/routes/index.html @@ -1,6 +1,6 @@ -mcaptcha::widget::routes - Rust +mcaptcha::widget::routes - Rust -

Module mcaptcha::widget::routes[][src]

Structs

-
Widget
- \ No newline at end of file +

Module mcaptcha::widget::routes[][src]

Structs

+
Widget
+ \ No newline at end of file diff --git a/mcaptcha/widget/routes/struct.Widget.html b/mcaptcha/widget/routes/struct.Widget.html index e831190b..ab7a5d2c 100644 --- a/mcaptcha/widget/routes/struct.Widget.html +++ b/mcaptcha/widget/routes/struct.Widget.html @@ -1,117 +1,113 @@ -mcaptcha::widget::routes::Widget - Rust +Widget in mcaptcha::widget::routes - Rust -

Struct mcaptcha::widget::routes::Widget[][src]

pub struct Widget {
+

Struct mcaptcha::widget::routes::Widget[][src]

pub struct Widget {
     pub verification_widget: &'static str,
     pub js: &'static str,
     pub wasm: &'static str,
 }

- Fields

verification_widget: &'static strjs: &'static strwasm: &'static str

Implementations

impl Widget[src]

pub const fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/widget/struct.INDEX_PAGE.html b/mcaptcha/widget/struct.INDEX_PAGE.html index 4b9b5c0d..7af7ab65 100644 --- a/mcaptcha/widget/struct.INDEX_PAGE.html +++ b/mcaptcha/widget/struct.INDEX_PAGE.html @@ -1,1555 +1,161 @@ -mcaptcha::widget::INDEX_PAGE - Rust +INDEX_PAGE in mcaptcha::widget - Rust -

Struct mcaptcha::widget::INDEX_PAGE[][src]

struct INDEX_PAGE {
+

Struct mcaptcha::widget::INDEX_PAGE[][src]

struct INDEX_PAGE {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

+ Fields__private_field: ()

Methods from Deref<Target = String>

pub fn as_str(&self) -> &str1.7.0[src]

Extracts a string slice containing the entire String.

Examples

Basic usage:

-let s = String::from("foo");
+let s = String::from("foo");
 
-assert_eq!("foo", s.as_str());
-

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String's capacity, in bytes.

+assert_eq!("foo", s.as_str());
+

pub fn capacity(&self) -> usize1.0.0[src]

Returns this String’s capacity, in bytes.

Examples

Basic usage:

-let s = String::with_capacity(10);
+let s = String::with_capacity(10);
 
-assert!(s.capacity() >= 10);
-

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String's contents.

+assert!(s.capacity() >= 10);
+

pub fn as_bytes(&self) -> &[u8]1.0.0[src]

Returns a byte slice of this String’s contents.

The inverse of this method is from_utf8.

Examples

Basic usage:

-let s = String::from("hello");
+let s = String::from("hello");
 
-assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
-

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or +assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());

+

pub fn len(&self) -> usize1.0.0[src]

Returns the length of this String, in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

-let a = String::from("foo");
-assert_eq!(a.len(), 3);
+let a = String::from("foo");
+assert_eq!(a.len(), 3);
 
-let fancy_f = String::from("ƒoo");
-assert_eq!(fancy_f.len(), 4);
-assert_eq!(fancy_f.chars().count(), 3);
-

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

+let fancy_f = String::from("ƒoo"); +assert_eq!(fancy_f.len(), 4); +assert_eq!(fancy_f.chars().count(), 3);
+

pub fn is_empty(&self) -> bool1.0.0[src]

Returns true if this String has a length of zero, and false otherwise.

Examples

Basic usage:

-let mut v = String::new();
-assert!(v.is_empty());
+let mut v = String::new();
+assert!(v.is_empty());
 
 v.push('a');
-assert!(!v.is_empty());
-

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0 (const: 1.32.0)[src]

Returns the length of self.

-

This length is in bytes, not chars or graphemes. In other words, -it may not be what a human considers the length of the string.

-

Examples

-

Basic usage:

- -
-let len = "foo".len();
-assert_eq!(3, len);
-
-assert_eq!("ƒoo".len(), 4); // fancy f!
-assert_eq!("ƒoo".chars().count(), 3);
-

pub const fn is_empty(&self) -> bool1.0.0 (const: 1.32.0)[src]

Returns true if self has a length of zero bytes.

-

Examples

-

Basic usage:

- -
-let s = "";
-assert!(s.is_empty());
-
-let s = "not empty";
-assert!(!s.is_empty());
-

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte is the first byte in a UTF-8 code point -sequence or the end of the string.

-

The start and end of the string (when index == self.len()) are -considered to be boundaries.

-

Returns false if index is greater than self.len().

-

Examples

-
-let s = "Löwe 老虎 Léopard";
-assert!(s.is_char_boundary(0));
-// start of `老`
-assert!(s.is_char_boundary(6));
-assert!(s.is_char_boundary(s.len()));
-
-// second byte of `ö`
-assert!(!s.is_char_boundary(2));
-
-// third byte of `老`
-assert!(!s.is_char_boundary(8));
-

pub const fn as_bytes(&self) -> &[u8]1.0.0 (const: 1.32.0)[src]

Converts a string slice to a byte slice. To convert the byte slice back -into a string slice, use the from_utf8 function.

-

Examples

-

Basic usage:

- -
-let bytes = "bors".as_bytes();
-assert_eq!(b"bors", bytes);
-

pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8]1.20.0[src]

Converts a mutable string slice to a mutable byte slice.

-

Safety

-

The caller must ensure that the content of the slice is valid UTF-8 -before the borrow ends and the underlying str is used.

-

Use of a str whose contents are not valid UTF-8 is undefined behavior.

-

Examples

-

Basic usage:

- -
-let mut s = String::from("Hello");
-let bytes = unsafe { s.as_bytes_mut() };
-
-assert_eq!(b"Hello", bytes);
-

Mutability:

- -
-let mut s = String::from("🗻∈🌏");
-
-unsafe {
-    let bytes = s.as_bytes_mut();
-
-    bytes[0] = 0xF0;
-    bytes[1] = 0x9F;
-    bytes[2] = 0x8D;
-    bytes[3] = 0x94;
-}
-
-assert_eq!("🍔∈🌏", s);
-

pub const fn as_ptr(&self) -> *const u81.0.0 (const: 1.32.0)[src]

Converts a string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

The caller must ensure that the returned pointer is never written to. -If you need to mutate the contents of the string slice, use as_mut_ptr.

-

Examples

-

Basic usage:

- -
-let s = "Hello";
-let ptr = s.as_ptr();
-

pub fn as_mut_ptr(&mut self) -> *mut u81.36.0[src]

Converts a mutable string slice to a raw pointer.

-

As string slices are a slice of bytes, the raw pointer points to a -u8. This pointer will be pointing to the first byte of the string -slice.

-

It is your responsibility to make sure that the string slice only gets -modified in a way that it remains valid UTF-8.

-

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let v = String::from("🗻∈🌏");
-
-assert_eq!(Some("🗻"), v.get(0..4));
-
-// indices not on UTF-8 sequence boundaries
-assert!(v.get(1..).is_none());
-assert!(v.get(..8).is_none());
-
-// out of bounds
-assert!(v.get(..42).is_none());
-

pub fn get_mut<I>(
    &mut self,
    i: I
) -> Option<&mut <I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable subslice of str.

-

This is the non-panicking alternative to indexing the str. Returns -None whenever equivalent indexing operation would panic.

-

Examples

-
-let mut v = String::from("hello");
-// correct length
-assert!(v.get_mut(0..5).is_some());
-// out of bounds
-assert!(v.get_mut(..42).is_none());
-assert_eq!(Some("he"), v.get_mut(0..2).map(|v| &*v));
-
-assert_eq!("hello", v);
-{
-    let s = v.get_mut(0..2);
-    let s = s.map(|s| {
-        s.make_ascii_uppercase();
-        &*s
-    });
-    assert_eq!(Some("HE"), s);
-}
-assert_eq!("HEllo", v);
-

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns an unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let v = "🗻∈🌏";
-unsafe {
-    assert_eq!("🗻", v.get_unchecked(0..4));
-    assert_eq!("∈", v.get_unchecked(4..7));
-    assert_eq!("🌏", v.get_unchecked(7..11));
-}
-

pub unsafe fn get_unchecked_mut<I>(
    &mut self,
    i: I
) -> &mut <I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a mutable, unchecked subslice of str.

-

This is the unchecked alternative to indexing the str.

-

Safety

-

Callers of this function are responsible that these preconditions are -satisfied:

-
    -
  • The starting index must not exceed the ending index;
  • -
  • Indexes must be within bounds of the original slice;
  • -
  • Indexes must lie on UTF-8 sequence boundaries.
  • -
-

Failing that, the returned string slice may reference invalid memory or -violate the invariants communicated by the str type.

-

Examples

-
-let mut v = String::from("🗻∈🌏");
-unsafe {
-    assert_eq!("🗻", v.get_unchecked_mut(0..4));
-    assert_eq!("∈", v.get_unchecked_mut(4..7));
-    assert_eq!("🌏", v.get_unchecked_mut(7..11));
-}
-

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks.

-

This is generally not recommended, use with caution! For a safe -alternative see str and Index.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get a mutable string slice instead, see the -slice_mut_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

Examples

-

Basic usage:

- -
-let s = "Löwe 老虎 Léopard";
-
-unsafe {
-    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
-}
-
-let s = "Hello, world!";
-
-unsafe {
-    assert_eq!("world", s.slice_unchecked(7, 12));
-}
-

pub unsafe fn slice_mut_unchecked(
    &mut self,
    begin: usize,
    end: usize
) -> &mut str
1.5.0[src]

👎 Deprecated since 1.29.0:

use get_unchecked_mut(begin..end) instead

-

Creates a string slice from another string slice, bypassing safety -checks. -This is generally not recommended, use with caution! For a safe -alternative see str and IndexMut.

-

This new slice goes from begin to end, including begin but -excluding end.

-

To get an immutable string slice instead, see the -slice_unchecked method.

-

Safety

-

Callers of this function are responsible that three preconditions are -satisfied:

-
    -
  • begin must not exceed end.
  • -
  • begin and end must be byte positions within the string slice.
  • -
  • begin and end must lie on UTF-8 sequence boundaries.
  • -
-

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get mutable string slices instead, see the split_at_mut -method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let s = "Per Martin-Löf";
-
-let (first, last) = s.split_at(3);
-
-assert_eq!("Per", first);
-assert_eq!(" Martin-Löf", last);
-

pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)1.4.0[src]

Divide one mutable string slice into two at an index.

-

The argument, mid, should be a byte offset from the start of the -string. It must also be on the boundary of a UTF-8 code point.

-

The two slices returned go from the start of the string slice to mid, -and from mid to the end of the string slice.

-

To get immutable string slices instead, see the split_at method.

-

Panics

-

Panics if mid is not on a UTF-8 code point boundary, or if it is -past the end of the last code point of the string slice.

-

Examples

-

Basic usage:

- -
-let mut s = "Per Martin-Löf".to_string();
-{
-    let (first, last) = s.split_at_mut(3);
-    first.make_ascii_uppercase();
-    assert_eq!("PER", first);
-    assert_eq!(" Martin-Löf", last);
-}
-assert_eq!("PER Martin-Löf", s);
-

pub fn chars(&self) -> Chars<'_>1.0.0[src]

Returns an iterator over the chars of a string slice.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns such an iterator.

-

It's important to remember that char represents a Unicode Scalar -Value, and may not match your idea of what a 'character' is. Iteration -over grapheme clusters may be what you actually want. This functionality -is not provided by Rust's standard library, check crates.io instead.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.chars().count();
-assert_eq!(7, count);
-
-let mut chars = word.chars();
-
-assert_eq!(Some('g'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('o'), chars.next());
-assert_eq!(Some('d'), chars.next());
-assert_eq!(Some('b'), chars.next());
-assert_eq!(Some('y'), chars.next());
-assert_eq!(Some('e'), chars.next());
-
-assert_eq!(None, chars.next());
-

Remember, chars may not match your intuition about characters:

- -
-let y = "y̆";
-
-let mut chars = y.chars();
-
-assert_eq!(Some('y'), chars.next()); // not 'y̆'
-assert_eq!(Some('\u{0306}'), chars.next());
-
-assert_eq!(None, chars.next());
-

pub fn char_indices(&self) -> CharIndices<'_>1.0.0[src]

Returns an iterator over the chars of a string slice, and their -positions.

-

As a string slice consists of valid UTF-8, we can iterate through a -string slice by char. This method returns an iterator of both -these chars, as well as their byte positions.

-

The iterator yields tuples. The position is first, the char is -second.

-

Examples

-

Basic usage:

- -
-let word = "goodbye";
-
-let count = word.char_indices().count();
-assert_eq!(7, count);
-
-let mut char_indices = word.char_indices();
-
-assert_eq!(Some((0, 'g')), char_indices.next());
-assert_eq!(Some((1, 'o')), char_indices.next());
-assert_eq!(Some((2, 'o')), char_indices.next());
-assert_eq!(Some((3, 'd')), char_indices.next());
-assert_eq!(Some((4, 'b')), char_indices.next());
-assert_eq!(Some((5, 'y')), char_indices.next());
-assert_eq!(Some((6, 'e')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

Remember, chars may not match your intuition about characters:

- -
-let yes = "y̆es";
-
-let mut char_indices = yes.char_indices();
-
-assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
-assert_eq!(Some((1, '\u{0306}')), char_indices.next());
-
-// note the 3 here - the last character took up two bytes
-assert_eq!(Some((3, 'e')), char_indices.next());
-assert_eq!(Some((4, 's')), char_indices.next());
-
-assert_eq!(None, char_indices.next());
-

pub fn bytes(&self) -> Bytes<'_>1.0.0[src]

An iterator over the bytes of a string slice.

-

As a string slice consists of a sequence of bytes, we can iterate -through a string slice by byte. This method returns such an iterator.

-

Examples

-

Basic usage:

- -
-let mut bytes = "bors".bytes();
-
-assert_eq!(Some(b'b'), bytes.next());
-assert_eq!(Some(b'o'), bytes.next());
-assert_eq!(Some(b'r'), bytes.next());
-assert_eq!(Some(b's'), bytes.next());
-
-assert_eq!(None, bytes.next());
-

pub fn split_whitespace(&self) -> SplitWhitespace<'_>1.1.0[src]

Splits a string slice by whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of whitespace.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space. If you only want to split on ASCII whitespace -instead, use split_ascii_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of whitespace are considered:

- -
-let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>1.34.0[src]

Splits a string slice by ASCII whitespace.

-

The iterator returned will return string slices that are sub-slices of -the original string slice, separated by any amount of ASCII whitespace.

-

To split by Unicode Whitespace instead, use split_whitespace.

-

Examples

-

Basic usage:

- -
-let mut iter = "A few words".split_ascii_whitespace();
-
-assert_eq!(Some("A"), iter.next());
-assert_eq!(Some("few"), iter.next());
-assert_eq!(Some("words"), iter.next());
-
-assert_eq!(None, iter.next());
-

All kinds of ASCII whitespace are considered:

- -
-let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
-assert_eq!(Some("Mary"), iter.next());
-assert_eq!(Some("had"), iter.next());
-assert_eq!(Some("a"), iter.next());
-assert_eq!(Some("little"), iter.next());
-assert_eq!(Some("lamb"), iter.next());
-
-assert_eq!(None, iter.next());
-

pub fn lines(&self) -> Lines<'_>1.0.0[src]

An iterator over the lines of a string, as string slices.

-

Lines are ended with either a newline (\n) or a carriage return with -a line feed (\r\n).

-

The final line ending is optional. A string that ends with a final line -ending will return the same lines as an otherwise identical string -without a final line ending.

-

Examples

-

Basic usage:

- -
-let text = "foo\r\nbar\n\nbaz\n";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

The final line ending isn't required:

- -
-let text = "foo\nbar\n\r\nbaz";
-let mut lines = text.lines();
-
-assert_eq!(Some("foo"), lines.next());
-assert_eq!(Some("bar"), lines.next());
-assert_eq!(Some(""), lines.next());
-assert_eq!(Some("baz"), lines.next());
-
-assert_eq!(None, lines.next());
-

pub fn lines_any(&self) -> LinesAny<'_>1.0.0[src]

👎 Deprecated since 1.4.0:

use lines() instead now

-

An iterator over the lines of a string.

-

pub fn encode_utf16(&self) -> EncodeUtf16<'_>1.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

-

Examples

-

Basic usage:

- -
-let text = "Zażółć gęślą jaźń";
-
-let utf8_len = text.len();
-let utf16_len = text.encode_utf16().count();
-
-assert!(utf16_len <= utf8_len);
-

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of -this string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.contains("nana"));
-assert!(!bananas.contains("apples"));
-

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.starts_with("bana"));
-assert!(!bananas.starts_with("nana"));
-

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this -string slice.

-

Returns false if it does not.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Basic usage:

- -
-let bananas = "bananas";
-
-assert!(bananas.ends_with("anas"));
-assert!(!bananas.ends_with("nana"));
-

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that -matches the pattern.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.find('L'), Some(0));
-assert_eq!(s.find('é'), Some(14));
-assert_eq!(s.find("pard"), Some(17));
-

More complex patterns using point-free style and closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.find(char::is_whitespace), Some(5));
-assert_eq!(s.find(char::is_lowercase), Some(1));
-assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
-assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.find(x), None);
-

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index for the first character of the rightmost match of the pattern in -this string slice.

-

Returns None if the pattern doesn't match.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-let s = "Löwe 老虎 Léopard Gepardi";
-
-assert_eq!(s.rfind('L'), Some(13));
-assert_eq!(s.rfind('é'), Some(14));
-assert_eq!(s.rfind("pard"), Some(24));
-

More complex patterns with closures:

- -
-let s = "Löwe 老虎 Léopard";
-
-assert_eq!(s.rfind(char::is_whitespace), Some(12));
-assert_eq!(s.rfind(char::is_lowercase), Some(20));
-

Not finding the pattern:

- -
-let s = "Löwe 老虎 Léopard";
-let x: &[_] = &['1', '2'];
-
-assert_eq!(s.rfind(x), None);
-

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
-assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
-
-let v: Vec<&str> = "".split('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
-assert_eq!(v, ["lion", "", "tiger", "leopard"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-
-let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-
-let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
-assert_eq!(v, ["lion", "tiger", "leopard"]);
-

If the pattern is a slice of chars, split on each occurrence of any of the characters:

- -
-let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
-assert_eq!(v, ["2020", "11", "03", "23", "59"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "def", "ghi"]);
-

If a string contains multiple contiguous separators, you will end up -with empty strings in the output:

- -
-let x = "||||a||b|c".to_string();
-let d: Vec<_> = x.split('|').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

Contiguous separators are separated by the empty string.

- -
-let x = "(///)".to_string();
-let d: Vec<_> = x.split('/').collect();
-
-assert_eq!(d, &["(", "", "", ")"]);
-

Separators at the start or end of a string are neighbored -by empty strings.

- -
-let d: Vec<_> = "010".split("0").collect();
-assert_eq!(d, &["", "1", ""]);
-

When the empty string is used as a separator, it separates -every character in the string, along with the beginning -and end of the string.

- -
-let f: Vec<_> = "rust".split("").collect();
-assert_eq!(f, &["", "r", "u", "s", "t", ""]);
-

Contiguous separators can lead to possibly surprising behavior -when whitespace is used as the separator. This code is correct:

- -
-let x = "    a  b c".to_string();
-let d: Vec<_> = x.split(' ').collect();
-
-assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
-

It does not give you:

- -
-assert_eq!(d, &["a", "b", "c"]);
-

Use split_whitespace for this behavior.

-

pub fn split_inclusive<'a, P>(&'a self, pat: P) -> SplitInclusive<'a, P> where
    P: Pattern<'a>, 
1.51.0[src]

An iterator over substrings of this string slice, separated by -characters matched by a pattern. Differs from the iterator produced by -split in that split_inclusive leaves the matched part as the -terminator of the substring.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
-

If the last element of the string is matched, -that element will be considered the terminator of the preceding substring. -That substring will be the last item returned by the iterator.

- -
-let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
-    .split_inclusive('\n').collect();
-assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
-

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
-assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
-
-let v: Vec<&str> = "".rsplit('X').collect();
-assert_eq!(v, [""]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
-assert_eq!(v, ["leopard", "tiger", "", "lion"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
-assert_eq!(v, ["leopard", "tiger", "lion"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "def", "abc"]);
-

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by -characters matched by a pattern.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring -is skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rsplit_terminator method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "A.B.".split_terminator('.').collect();
-assert_eq!(v, ["A", "B"]);
-
-let v: Vec<&str> = "A..B..".split_terminator(".").collect();
-assert_eq!(v, ["A", "", "B", ""]);
-

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters -matched by a pattern and yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Equivalent to split, except that the trailing substring is -skipped if empty.

-

This method can be used for string data that is terminated, -rather than separated by a pattern.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a -reverse search, and it will be double ended if a forward/reverse -search yields the same elements.

-

For iterating from the front, the split_terminator method can be -used.

-

Examples

-
-let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
-assert_eq!(v, ["B", "A"]);
-
-let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
-assert_eq!(v, ["", "B", "", "A"]);
-

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a -pattern, restricted to returning at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is -not efficient to support.

-

If the pattern allows a reverse search, the rsplitn method can be -used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
-assert_eq!(v, ["Mary", "had", "a little lambda"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
-assert_eq!(v, ["lion", "", "tigerXleopard"]);
-
-let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
-assert_eq!(v, ["abcXdef"]);
-
-let v: Vec<&str> = "".splitn(1, 'X').collect();
-assert_eq!(v, [""]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["abc", "defXghi"]);
-

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a -pattern, starting from the end of the string, restricted to returning -at most n items.

-

If n substrings are returned, the last substring (the nth substring) -will contain the remainder of the string.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will not be double ended, because it is not -efficient to support.

-

For splitting from the front, the splitn method can be used.

-

Examples

-

Simple patterns:

- -
-let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
-assert_eq!(v, ["lamb", "little", "Mary had a"]);
-
-let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
-assert_eq!(v, ["leopard", "tiger", "lionX"]);
-
-let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
-assert_eq!(v, ["leopard", "lion::tiger"]);
-

A more complex pattern, using a closure:

- -
-let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
-assert_eq!(v, ["ghi", "abc1def"]);
-

pub fn split_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the first occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".split_once('='), None);
-assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
-

pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
[src]

🔬 This is a nightly-only experimental API. (str_split_once)

newly added

-

Splits the string on the last occurrence of the specified delimiter and -returns prefix before delimiter and suffix after delimiter.

-

Examples

-
-#![feature(str_split_once)]
-
-assert_eq!("cfg".rsplit_once('='), None);
-assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
-assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
-

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string -slice.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
-assert_eq!(v, ["1", "2", "3"]);
-

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, -yielded in reverse order.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the matches method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
-assert_eq!(v, ["abc", "abc", "abc"]);
-
-let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
-assert_eq!(v, ["3", "2", "1"]);
-

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string -slice as well as the index that the match starts at.

-

For matches of pat within self that overlap, only the indices -corresponding to the first match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator will be a DoubleEndedIterator if the pattern -allows a reverse search and forward/reverse search yields the same -elements. This is true for, e.g., char, but not for &str.

-

If the pattern allows a reverse search but its results might differ -from a forward search, the rmatch_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
-assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
-
-let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
-assert_eq!(v, [(1, "abc"), (4, "abc")]);
-
-let v: Vec<_> = "ababa".match_indices("aba").collect();
-assert_eq!(v, [(0, "aba")]); // only the first `aba`
-

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, -yielded in reverse order along with the index of the match.

-

For matches of pat within self that overlap, only the indices -corresponding to the last match are returned.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Iterator behavior

-

The returned iterator requires that the pattern supports a reverse -search, and it will be a DoubleEndedIterator if a forward/reverse -search yields the same elements.

-

For iterating from the front, the match_indices method can be used.

-

Examples

-

Basic usage:

- -
-let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
-assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
-
-let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
-assert_eq!(v, [(4, "abc"), (1, "abc")]);
-
-let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
-assert_eq!(v, [(2, "aba")]); // only the last `aba`
-

#[must_use = - "this returns the trimmed string as a slice, \ - without modifying the original"]pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld", s.trim());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!("Hello\tworld\t", s.trim_start());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('E') == s.trim_start().chars().next());
-
-let s = "  עברית  ";
-assert!(Some('ע') == s.trim_start().chars().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-assert_eq!(" Hello\tworld", s.trim_end());
-

Directionality:

- -
-let s = "  English  ";
-assert!(Some('h') == s.trim_end().chars().rev().next());
-
-let s = "  עברית  ";
-assert!(Some('ת') == s.trim_end().chars().rev().next());
-

pub fn trim_left(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start

-

Returns a string slice with leading whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!("Hello\tworld\t", s.trim_left());
-

Directionality:

- -
-let s = "  English";
-assert!(Some('E') == s.trim_left().chars().next());
-
-let s = "  עברית";
-assert!(Some('ע') == s.trim_left().chars().next());
-

pub fn trim_right(&self) -> &str1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end

-

Returns a string slice with trailing whitespace removed.

-

'Whitespace' is defined according to the terms of the Unicode Derived -Core Property White_Space.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Basic usage:

- -
-let s = " Hello\tworld\t";
-
-assert_eq!(" Hello\tworld", s.trim_right());
-

Directionality:

- -
-let s = "English  ";
-assert!(Some('h') == s.trim_right().chars().rev().next());
-
-let s = "עברית  ";
-assert!(Some('ת') == s.trim_right().chars().rev().next());
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a -pattern repeatedly removed.

-

The pattern can be a char, a slice of chars, or a function -or closure that determines if a character matches.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
-assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. start in this context means the first -position of that byte string; for a left-to-right language like English or -Russian, this will be left side, and for right-to-left languages like -Arabic or Hebrew, this will be the right side.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_prefix<'a, P>(&'a self, prefix: P) -> Option<&'a str> where
    P: Pattern<'a>, 
1.45.0[src]

Returns a string slice with the prefix removed.

-

If the string starts with the pattern prefix, returns substring after the prefix, wrapped -in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

-

If the string does not start with prefix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
-assert_eq!("foo:bar".strip_prefix("bar"), None);
-assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
-

#[must_use = - "this returns the remaining substring as a new slice, \ - without modifying the original"]pub fn strip_suffix<'a, P>(&'a self, suffix: P) -> Option<&'a str> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.45.0[src]

Returns a string slice with the suffix removed.

-

If the string ends with the pattern suffix, returns the substring before the suffix, -wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

-

If the string does not end with suffix, returns None.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Examples

-
-assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
-assert_eq!("bar:foo".strip_suffix("bar"), None);
-assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
-

#[must_use = - "this returns the trimmed string as a new slice, \ - without modifying the original"]pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. end in this context means the last -position of that byte string; for a left-to-right language like English or -Russian, this will be right side, and for right-to-left languages like -Arabic or Hebrew, this will be the left side.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_start_matches

-

Returns a string slice with all prefixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Left' in this context means the first -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the right side, not the left.

-

Examples

-

Basic usage:

- -
-assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
-assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
-

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

👎 Deprecated since 1.33.0:

superseded by trim_end_matches

-

Returns a string slice with all suffixes that match a pattern -repeatedly removed.

-

The pattern can be a &str, char, a slice of chars, or a -function or closure that determines if a character matches.

-

Text directionality

-

A string is a sequence of bytes. 'Right' in this context means the last -position of that byte string; for a language like Arabic or Hebrew -which are 'right to left' rather than 'left to right', this will be -the left side, not the right.

-

Examples

-

Simple patterns:

- -
-assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
-assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
-
-let x: &[_] = &['1', '2'];
-assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
-

A more complex pattern, using a closure:

- -
-assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
-

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

-

Because parse is so general, it can cause problems with type -inference. As such, parse is one of the few times you'll see -the syntax affectionately known as the 'turbofish': ::<>. This -helps the inference algorithm understand specifically which type -you're trying to parse into.

-

parse can parse into any type that implements the FromStr trait.

-

Errors

-

Will return Err if it's not possible to parse this string slice into -the desired type.

-

Examples

-

Basic usage

- -
-let four: u32 = "4".parse().unwrap();
-
-assert_eq!(4, four);
-

Using the 'turbofish' instead of annotating four:

- -
-let four = "4".parse::<u32>();
-
-assert_eq!(Ok(4), four);
-

Failing to parse:

- -
-let nope = "j".parse::<u32>();
-
-assert!(nope.is_err());
-

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

-

Examples

-
-let ascii = "hello!\n";
-let non_ascii = "Grüße, Jürgen ❤";
-
-assert!(ascii.is_ascii());
-assert!(!non_ascii.is_ascii());
-

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

-

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), -but without allocating and copying temporaries.

-

Examples

-
-assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
-assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
-assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
-

pub fn make_ascii_uppercase(&mut self)1.23.0[src]

Converts this string to its ASCII upper case equivalent in-place.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To return a new uppercased value without modifying the existing one, use -to_ascii_uppercase().

-

Examples

-
-let mut s = String::from("Grüße, Jürgen ❤");
-
-s.make_ascii_uppercase();
-
-assert_eq!("GRüßE, JüRGEN ❤", s);
-

pub fn make_ascii_lowercase(&mut self)1.23.0[src]

Converts this string to its ASCII lower case equivalent in-place.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To return a new lowercased value without modifying the existing one, use -to_ascii_lowercase().

-

Examples

-
-let mut s = String::from("GRÜßE, JÜRGEN ❤");
-
-s.make_ascii_lowercase();
-
-assert_eq!("grÜße, jÜrgen ❤", s);
-

pub fn escape_debug(&self) -> EscapeDebug<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

-

Note: only extended grapheme codepoints that begin the string will be -escaped.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_debug() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_debug());
-

Both are equivalent to:

- -
-println!("❤\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
-

pub fn escape_default(&self) -> EscapeDefault<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_default() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_default());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\n!");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
-

pub fn escape_unicode(&self) -> EscapeUnicode<'_>1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

-

Examples

-

As an iterator:

- -
-for c in "❤\n!".escape_unicode() {
-    print!("{}", c);
-}
-println!();
-

Using println! directly:

- -
-println!("{}", "❤\n!".escape_unicode());
-

Both are equivalent to:

- -
-println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
-

Using to_string:

- -
-assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

-

replace creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice.

-

Examples

-

Basic usage:

- -
-let s = "this is old";
-
-assert_eq!("this is new", s.replace("old", "new"));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replace("cookie monster", "little lamb"));
-

#[must_use = - "this returns the replaced string as a new allocation, \ - without modifying the original"]pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

-

replacen creates a new String, and copies the data from this string slice into it. -While doing so, it attempts to find matches of a pattern. If it finds any, it -replaces them with the replacement string slice at most count times.

-

Examples

-

Basic usage:

- -
-let s = "foo foo 123 foo";
-assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
-assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
-assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
-

When the pattern doesn't match:

- -
-let s = "this is old";
-assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
-

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

-

'Lowercase' is defined according to the terms of the Unicode Derived Core Property -Lowercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "HELLO";
-
-assert_eq!("hello", s.to_lowercase());
-

A tricky example, with sigma:

- -
-let sigma = "Σ";
-
-assert_eq!("σ", sigma.to_lowercase());
-
-// but at the end of a word, it's ς, not σ:
-let odysseus = "ὈΔΥΣΣΕΎΣ";
-
-assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
-

Languages without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_lowercase());
-

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

-

'Uppercase' is defined according to the terms of the Unicode Derived Core Property -Uppercase.

-

Since some characters can expand into multiple characters when changing -the case, this function returns a String instead of modifying the -parameter in-place.

-

Examples

-

Basic usage:

- -
-let s = "hello";
-
-assert_eq!("HELLO", s.to_uppercase());
-

Scripts without case are not changed:

- -
-let new_year = "农历新年";
-
-assert_eq!(new_year, new_year.to_uppercase());
-

One character can become multiple:

- -
-let s = "tschüß";
-
-assert_eq!("TSCHÜSS", s.to_uppercase());
-

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

-

Panics

-

This function will panic if the capacity would overflow.

-

Examples

-

Basic usage:

- -
-assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
-

A panic upon overflow:

- -
-// this will panic at runtime
-"0123456789abcdef".repeat(usize::MAX);
-

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII upper case equivalent.

-

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', -but non-ASCII letters are unchanged.

-

To uppercase the value in-place, use make_ascii_uppercase.

-

To uppercase ASCII characters in addition to non-ASCII characters, use -to_uppercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
-

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its -ASCII lower case equivalent.

-

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', -but non-ASCII letters are unchanged.

-

To lowercase the value in-place, use make_ascii_lowercase.

-

To lowercase ASCII characters in addition to non-ASCII characters, use -to_lowercase.

-

Examples

-
-let s = "Grüße, Jürgen ❤";
-
-assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

impl Deref for INDEX_PAGE[src]

type Target = String

The resulting type after dereferencing.

-

impl LazyStatic for INDEX_PAGE[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

+

Trait Implementations

impl Deref for INDEX_PAGE[src]

type Target = String

The resulting type after dereferencing.

+

impl LazyStatic for INDEX_PAGE[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/widget/struct.IndexPage.html b/mcaptcha/widget/struct.IndexPage.html index 05ff4dc3..9fbd781d 100644 --- a/mcaptcha/widget/struct.IndexPage.html +++ b/mcaptcha/widget/struct.IndexPage.html @@ -1,120 +1,116 @@ -mcaptcha::widget::IndexPage - Rust +IndexPage in mcaptcha::widget - Rust -

Struct mcaptcha::widget::IndexPage[][src]

pub struct IndexPage;

Implementations

impl IndexPage[src]

fn new() -> Self[src]

Trait Implementations

impl Clone for IndexPage[src]

impl Sealed for IndexPage[src]

impl TemplateOnce for IndexPage[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/widget/struct.WidgetAssets.html b/mcaptcha/widget/struct.WidgetAssets.html index c2c4fb2b..74c0a940 100644 --- a/mcaptcha/widget/struct.WidgetAssets.html +++ b/mcaptcha/widget/struct.WidgetAssets.html @@ -1,114 +1,110 @@ -mcaptcha::widget::WidgetAssets - Rust +WidgetAssets in mcaptcha::widget - Rust -

Struct mcaptcha::widget::WidgetAssets[][src]

struct WidgetAssets;

Implementations

impl WidgetAssets[src]

pub fn get(file_path: &str) -> Option<Cow<'static, [u8]>>[src]

pub fn iter() -> impl Iterator<Item = Cow<'static, str>>[src]

Trait Implementations

impl RustEmbed for WidgetAssets[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/widget/struct.show_widget.html b/mcaptcha/widget/struct.show_widget.html index 4092f1f5..d8addbfe 100644 --- a/mcaptcha/widget/struct.show_widget.html +++ b/mcaptcha/widget/struct.show_widget.html @@ -1,113 +1,109 @@ -mcaptcha::widget::show_widget - Rust +show_widget in mcaptcha::widget - Rust -

Struct mcaptcha::widget::show_widget[][src]

pub struct show_widget;

render a client side widget for CAPTCHA verification

-

Trait Implementations

impl HttpServiceFactory for show_widget[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/mcaptcha/widget/struct.widget_assets.html b/mcaptcha/widget/struct.widget_assets.html index fa340e63..5f48aac3 100644 --- a/mcaptcha/widget/struct.widget_assets.html +++ b/mcaptcha/widget/struct.widget_assets.html @@ -1,112 +1,108 @@ -mcaptcha::widget::widget_assets - Rust +widget_assets in mcaptcha::widget - Rust -

Struct mcaptcha::widget::widget_assets[][src]

pub struct widget_assets;

Trait Implementations

impl HttpServiceFactory for widget_assets[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/noscript.css b/noscript.css index 5cbcb901..807cd868 100644 --- a/noscript.css +++ b/noscript.css @@ -1 +1 @@ - #main>h2+div,#main>h2+h3,#main>h3+div{display:block;}.loading-content{display:none;}#main>h2+div,#main>h3+div{display:block;}#main>h2+h3{display:flex;}#main .impl-items .hidden{display:block !important;} \ No newline at end of file + #main>h2+div,#main>h2+h3,#main>h3+div{display:block;}.loading-content{display:none;}#main>h2+div,#main>h3+div{display:block;}#main>h2+h3{display:flex;}#main .impl-items .hidden{display:block !important;}#main .impl-items h4.hidden{display:flex !important;}#main .attributes{margin-left:0 !important;}#copy-path{display:none;} \ No newline at end of file diff --git a/rustdoc.css b/rustdoc.css index ecb81ce7..909b415b 100644 --- a/rustdoc.css +++ b/rustdoc.css @@ -1 +1 @@ - @font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular.woff") format('woff');}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:normal;font-weight:400;src:local('Source Serif Pro'),url("SourceSerifPro-Regular.ttf.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:italic;font-weight:400;src:local('Source Serif Pro Italic'),url("SourceSerifPro-It.ttf.woff") format('woff');}@font-face {font-family:'Source Serif Pro';font-style:normal;font-weight:700;src:local('Source Serif Pro Bold'),url("SourceSerifPro-Bold.ttf.woff") format('woff');}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular.woff") format('woff');}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold.woff") format('woff');}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}html{content:"";}@media (prefers-color-scheme:light){html{content:"light";}}@media (prefers-color-scheme:dark){html{content:"dark";}}body{font:16px/1.4 "Source Serif Pro",serif;margin:0;position:relative;padding:10px 15px 20px 15px;-webkit-font-feature-settings:"kern","liga";-moz-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";}h1{font-size:1.5em;}h2{font-size:1.4em;}h3{font-size:1.3em;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod):not(.notable),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){font-weight:500;margin:20px 0 15px 0;padding-bottom:6px;}h1.fqn{border-bottom:1px dashed;margin-top:0;}h1.fqn>.in-band>a:hover{text-decoration:underline;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){border-bottom:1px solid;}h3.impl,h3.method,h4.method,h3.type,h4.type,h4.associatedconstant{flex-basis:100%;font-weight:600;margin-top:16px;margin-bottom:10px;position:relative;}h3.impl,h3.method,h3.type{padding-left:15px;}h1,h2,h3,h4,.sidebar,a.source,.search-input,.content table td:first-child>a,.collapse-toggle,div.item-list .out-of-band,#source-sidebar,#sidebar-toggle,#main>ul.docblock>li>a{font-family:"Fira Sans",sans-serif;}.content ul.crate a.crate{font:16px/1.6 "Fira Sans";}ol,ul{padding-left:25px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.6em;}p{margin:0 0 .6em 0;}summary{outline:none;}code,pre,a.test-arrow{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.1em;}.docblock pre code,.docblock-short pre code,.docblock code.spotlight{padding:0;padding-right:1ex;}.docblock code.spotlight :last-child{padding-bottom:0.6em;}pre{padding:14px;}.source .content pre{padding:20px;}img{max-width:100%;}li{position:relative;}.source .content{margin-top:50px;max-width:none;overflow:visible;margin-left:0px;min-width:70em;}nav.sub{font-size:16px;text-transform:uppercase;}.sidebar{width:200px;position:fixed;left:0;top:0;bottom:0;overflow:auto;}*{scrollbar-width:initial;}.sidebar{scrollbar-width:thin;}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;}.sidebar .block>ul>li{margin-right:-10px;}.content,nav{max-width:960px;}.hidden{display:none !important;}.logo-container{height:100px;width:100px;position:relative;margin:20px auto;display:block;margin-top:10px;}.logo-container>img{max-width:100px;max-height:100px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:block;}.sidebar .location{border:1px solid;font-size:17px;margin:30px 10px 20px 10px;text-align:center;word-wrap:break-word;}.sidebar .version{font-size:15px;text-align:center;border-bottom:1px solid;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;}.location:empty{border:none;}.location a:first-child{font-weight:500;}.block{padding:0;margin-bottom:14px;}.block h2,.block h3{margin-top:0;margin-bottom:8px;text-align:center;}.block ul,.block li{margin:0 10px;padding:0;list-style:none;}.block a{display:block;text-overflow:ellipsis;overflow:hidden;line-height:15px;padding:7px 5px;font-size:14px;font-weight:300;transition:border 500ms ease-out;}.sidebar-title{border-top:1px solid;border-bottom:1px solid;text-align:center;font-size:17px;margin-bottom:5px;}.sidebar-links{margin-bottom:15px;}.sidebar-links>a{padding-left:10px;width:100%;}.sidebar-menu{display:none;}.content{padding:15px 0;}.source .content pre.rust{white-space:pre;overflow:auto;padding-left:0;}.rustdoc:not(.source) .example-wrap{display:inline-flex;margin-bottom:10px;position:relative;}.example-wrap{width:100%;}.example-wrap>pre.line-number{overflow:initial;border:1px solid;border-top-left-radius:5px;border-bottom-left-radius:5px;padding:13px 8px;text-align:right;}.rustdoc:not(.source) .example-wrap>pre.rust{width:100%;overflow-x:auto;}.rustdoc:not(.source) .example-wrap>pre{margin:0;}#search{margin-left:230px;position:relative;}#results{position:absolute;right:0;left:0;overflow:auto;}#results>table{width:100%;table-layout:fixed;margin-bottom:40px;}.content pre.line-numbers{float:left;border:none;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers span{cursor:pointer;}.docblock-short{overflow-wrap:anywhere;}.docblock-short p{display:inline;}.docblock-short p{overflow:hidden;text-overflow:ellipsis;margin:0;}.docblock-short code{white-space:pre-wrap;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom:1px solid;}#main>.docblock h1{font-size:1.3em;}#main>.docblock h2{font-size:1.15em;}#main>.docblock h3,#main>.docblock h4,#main>.docblock h5{font-size:1em;}#main>h2+div,#main>h2+h3,#main>h3+div{display:none;flex-wrap:wrap;}.docblock h1{font-size:1em;}.docblock h2{font-size:0.95em;}.docblock h3,.docblock h4,.docblock h5{font-size:0.9em;}.docblock{margin-left:24px;position:relative;}.content .out-of-band{float:right;font-size:23px;margin:0px;padding:0px;font-weight:normal;}h3.impl>.out-of-band{font-size:21px;}h4.method>.out-of-band{font-size:19px;}h4>code,h3>code,.invisible>code{max-width:calc(100% - 41px);display:block;}.invisible{width:100%;display:inline-block;}.content .in-band{margin:0px;padding:0px;}.in-band>code{display:inline-block;}#main{position:relative;}#main>.since{top:inherit;font-family:"Fira Sans",sans-serif;}.content table:not(.table-display){border-spacing:0 5px;}.content td{vertical-align:top;}.content td:first-child{padding-right:20px;}.content td p:first-child{margin-top:0;}.content td h1,.content td h2{margin-left:0;font-size:1.1em;}.content tr:first-child td{border-top:0;}.docblock table{margin:.5em 0;width:calc(100% - 2px);border:1px dashed;}.docblock table td{padding:.5em;border:1px dashed;}.docblock table th{padding:.5em;text-align:left;border:1px solid;}.fields+table{margin-bottom:1em;}.content .item-list{list-style-type:none;padding:0;}.content .multi-column{-moz-column-count:5;-moz-column-gap:2.5em;-webkit-column-count:5;-webkit-column-gap:2.5em;column-count:5;column-gap:2.5em;}.content .multi-column li{width:100%;display:inline-block;}.content .method{font-size:1em;position:relative;}.content .method .where,.content .fn .where,.content .where.fmt-newline{display:block;font-size:0.8em;}.content .methods>div:not(.notable-traits){margin-left:40px;margin-bottom:15px;}.content .docblock>.impl-items{margin-left:20px;margin-top:-34px;}.content .docblock>.impl-items>h4{border-bottom:0;}.content .docblock>.impl-items .table-display{margin:0;}.content .docblock>.impl-items table td{padding:0;}.toggle-wrapper.marg-left>.collapse-toggle{left:-24px;}.content .docblock>.impl-items .table-display,.impl-items table td{border:none;}.content .item-info code{font-size:90%;}.content .item-info{position:relative;margin-left:33px;margin-top:-13px;}.sub-variant>div>.item-info{margin-top:initial;}.content .item-info::before{content:'⬑';font-size:25px;position:absolute;top:-6px;left:-19px;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{margin-left:20px;}.content .impl-items .docblock,.content .impl-items .item-info{margin-bottom:.6em;}.content .impl-items>.item-info{margin-left:40px;}.methods>.item-info,.content .impl-items>.item-info{margin-top:-8px;}.impl-items{flex-basis:100%;}#main>.item-info{margin-top:0;}nav:not(.sidebar){border-bottom:1px solid;padding-bottom:10px;margin-bottom:10px;}nav.main{padding:20px 0;text-align:center;}nav.main .current{border-top:1px solid;border-bottom:1px solid;}nav.main .separator{border:1px solid;display:inline-block;height:23px;margin:0 20px;}nav.sum{text-align:right;}nav.sub form{display:inline;}nav.sub,.content{margin-left:230px;}a{text-decoration:none;background:transparent;}.small-section-header:hover>.anchor{display:initial;}.in-band:hover>.anchor,.impl:hover>.anchor{display:inline-block;position:absolute;}.anchor{display:none;position:absolute;left:-7px;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-28px;padding-right:10px;}.anchor:before{content:'\2002\00a7\2002';}.docblock a:not(.srclink):not(.test-arrow):hover,.docblock-short a:not(.srclink):not(.test-arrow):hover,.item-info a{text-decoration:underline;}.invisible>.srclink,h4>code+.srclink,h3>code+.srclink{position:absolute;top:0;right:0;font-size:17px;font-weight:normal;}.block a.current.crate{font-weight:500;}.search-container{position:relative;}.search-container>div{display:inline-flex;width:calc(100% - 63px);}#crate-search{margin-top:5px;padding:6px;padding-right:19px;flex:none;border:0;border-right:0;border-radius:4px 0 0 4px;outline:none;cursor:pointer;border-right:1px solid;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;text-overflow:"";background-repeat:no-repeat;background-color:transparent;background-size:20px;background-position:calc(100% - 1px) 56%;}.search-container>.top-button{position:absolute;right:0;top:10px;}.search-input{-moz-box-sizing:border-box !important;box-sizing:border-box !important;outline:none;border:none;border-radius:1px;margin-top:5px;padding:10px 16px;font-size:17px;transition:border-color 300ms ease;transition:border-radius 300ms ease-in-out;transition:box-shadow 300ms ease-in-out;width:100%;}#crate-search+.search-input{border-radius:0 1px 1px 0;width:calc(100% - 32px);}.search-input:focus{border-radius:2px;border:0;outline:0;}.search-results .desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;}.search-results a{display:block;}.content .search-results td:first-child{padding-right:0;width:50%;}.content .search-results td:first-child a{padding-right:10px;}.content .search-results td:first-child a:after{clear:both;content:"";display:block;}.content .search-results td:first-child a span{float:left;}tr.result span.primitive::after{content:' (primitive type)';font-style:italic;}tr.result span.keyword::after{content:' (keyword)';font-style:italic;}body.blur>:not(#help){filter:blur(8px);-webkit-filter:blur(8px);opacity:.7;}#help{width:100%;height:100vh;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;}#help>div{flex:0 0 auto;box-shadow:0 0 6px rgba(0,0,0,.2);width:550px;height:auto;border:1px solid;}#help dt{float:left;clear:left;display:block;margin-right:0.5rem;}#help>div>span{text-align:center;display:block;margin:10px 0;font-size:18px;border-bottom:1px solid #ccc;padding-bottom:4px;margin-bottom:6px;}#help dd{margin:5px 35px;}#help .infos{padding-left:0;}#help h1,#help h2{margin-top:0;}#help>div div{width:50%;float:left;padding:0 20px 20px 17px;;}.stab{display:table;border-width:1px;border-style:solid;padding:3px;margin-bottom:5px;font-size:90%;}.stab p{display:inline;}.stab summary{display:list-item;}.stab .emoji{font-size:1.5em;}.module-item .stab{border-radius:3px;display:inline-block;font-size:80%;line-height:1.2;margin-bottom:0;margin-right:.3em;padding:2px;vertical-align:text-bottom;}.module-item.unstable{opacity:0.65;}.since{font-weight:normal;font-size:initial;position:absolute;right:0;top:0;}.impl-items .since,.impl .since,.methods .since{flex-grow:0;padding-left:12px;padding-right:2px;position:initial;}.impl-items .srclink,.impl .srclink,.methods .srclink{flex-grow:0;font-size:17px;font-weight:normal;}.impl-items code,.impl code,.methods code{flex-grow:1;}.impl-items h4,h4.impl,h3.impl,.methods h3{display:flex;flex-basis:100%;font-size:16px;margin-bottom:12px;justify-content:space-between;}.variants_table{width:100%;}.variants_table tbody tr td:first-child{width:1%;}td.summary-column{width:100%;}.summary{padding-right:0px;}pre.rust .question-mark{font-weight:bold;}a.test-arrow{display:inline-block;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:130%;top:5px;right:5px;z-index:1;}a.test-arrow:hover{text-decoration:none;}.section-header:hover a:before{position:absolute;left:-25px;padding-right:10px;content:'\2002\00a7\2002';}.section-header:hover a{text-decoration:none;}.section-header a{color:inherit;}.collapse-toggle{font-weight:300;position:absolute;left:-23px;top:0;}h3>.collapse-toggle,h4>.collapse-toggle{font-size:0.8em;top:5px;}.toggle-wrapper>.collapse-toggle{left:-24px;margin-top:0px;}.toggle-wrapper{position:relative;margin-top:0;}.toggle-wrapper.collapsed{height:25px;transition:height .2s;margin-bottom:.6em;}.collapse-toggle>.inner{display:inline-block;width:1.2ch;text-align:center;}.collapse-toggle.hidden-default{position:relative;margin-left:20px;}.since+.srclink{display:table-cell;padding-left:10px;}.item-spacer{width:100%;height:12px;}.out-of-band>span.since{position:initial;font-size:20px;margin-right:5px;}.toggle-wrapper>.collapse-toggle{left:0;}.variant+.toggle-wrapper+.docblock>p{margin-top:5px;}.sub-variant,.sub-variant>h3{margin-top:1px !important;}#main>.sub-variant>h3{font-size:15px;margin-left:25px;margin-bottom:5px;}.sub-variant>div{margin-left:20px;margin-bottom:10px;}.sub-variant>div>span{display:block;position:relative;}.toggle-label{display:inline-block;margin-left:4px;margin-top:3px;}.enum>.toggle-wrapper+.docblock,.struct>.toggle-wrapper+.docblock{margin-left:30px;margin-bottom:20px;margin-top:5px;}.docblock>.section-header:first-child{margin-left:15px;margin-top:0;}.docblock>.section-header:first-child:hover>a:before{left:-10px;}.enum>.collapsed,.struct>.collapsed{margin-bottom:25px;}#main>.variant,#main>.structfield{display:block;}.attributes{display:block;margin-top:0px !important;margin-right:0px;margin-bottom:0px !important;margin-left:30px;}.toggle-attributes.collapsed{margin-bottom:0;}.impl-items>.toggle-attributes{margin-left:20px;}.impl-items .attributes{font-weight:500;}:target>code{opacity:1;}.information{position:absolute;left:-25px;margin-top:7px;z-index:1;}.tooltip{position:relative;display:inline-block;cursor:pointer;}.tooltip::after{display:none;text-align:center;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;font-size:16px;}.tooltip.ignore::after{content:"This example is not tested";}.tooltip.compile_fail::after{content:"This example deliberately fails to compile";}.tooltip.should_panic::after{content:"This example panics";}.tooltip.edition::after{content:"This code runs with edition " attr(data-edition);}.tooltip::before{content:" ";position:absolute;top:50%;left:16px;margin-top:-5px;border-width:5px;border-style:solid;display:none;}.tooltip:hover::before,.tooltip:hover::after{display:inline;}.tooltip.compile_fail,.tooltip.should_panic,.tooltip.ignore{font-weight:bold;font-size:20px;}.notable-traits-tooltip{display:inline-block;cursor:pointer;}.notable-traits:hover .notable-traits-tooltiptext,.notable-traits .notable-traits-tooltiptext.force-tooltip{display:inline-block;}.notable-traits .notable-traits-tooltiptext{display:none;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;z-index:10;font-size:16px;cursor:default;position:absolute;border:1px solid;}.notable-traits-tooltip::after{content:"\00a0\00a0\00a0";}.notable-traits .notable,.notable-traits .docblock{margin:0;}.notable-traits .docblock code.content{margin:0;padding:0;font-size:20px;}pre.rust.rust-example-rendered{position:relative;}pre.rust{tab-size:4;-moz-tab-size:4;}.search-failed{text-align:center;margin-top:20px;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#titles{height:35px;}#titles>button{float:left;width:33.3%;text-align:center;font-size:18px;cursor:pointer;border:0;border-top:2px solid;}#titles>button:not(:last-child){margin-right:1px;width:calc(33.3% - 1px);}#titles>button>div.count{display:inline-block;font-size:16px;}.notable-traits{cursor:pointer;z-index:2;margin-left:5px;}h4>.notable-traits{position:absolute;left:-44px;top:2px;}#all-types{text-align:center;border:1px solid;margin:0 10px;margin-bottom:10px;display:block;border-radius:7px;}#all-types>p{margin:5px 0;}#sidebar-toggle{position:fixed;top:30px;left:300px;z-index:10;padding:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;cursor:pointer;font-weight:bold;transition:left .5s;font-size:1.2em;border:1px solid;border-left:0;}#source-sidebar{position:fixed;top:0;bottom:0;left:0;width:300px;z-index:1;overflow:auto;transition:left .5s;border-right:1px solid;}#source-sidebar>.title{font-size:1.5em;text-align:center;border-bottom:1px solid;margin-bottom:6px;}.theme-picker{position:absolute;left:211px;top:19px;}.theme-picker button{outline:none;}#settings-menu,.help-button{position:absolute;top:10px;}#settings-menu{right:0;outline:none;}.help-button{right:30px;font-family:"Fira Sans",sans-serif;text-align:center;font-size:17px;}#theme-picker,#settings-menu,.help-button{padding:4px;width:27px;height:29px;border:1px solid;border-radius:3px;cursor:pointer;}#theme-choices{display:none;position:absolute;left:0;top:28px;border:1px solid;border-radius:3px;z-index:1;cursor:pointer;}#theme-choices>button{border:none;width:100%;padding:4px 8px;text-align:center;background:rgba(0,0,0,0);}#theme-choices>button:not(:first-child){border-top:1px solid;}@media (min-width:701px){.information:first-child>.tooltip{margin-top:16px;}}@media (max-width:700px){body{padding-top:0px;}.rustdoc>.sidebar{height:45px;min-height:40px;margin:0;margin-left:-15px;padding:0 15px;position:static;z-index:11;}.sidebar>.location{float:right;margin:0px;margin-top:2px;padding:3px 10px 1px 10px;min-height:39px;background:inherit;text-align:left;font-size:24px;}.sidebar .location:empty{padding:0;}.sidebar .logo-container{width:35px;height:35px;margin-top:5px;margin-bottom:5px;float:left;margin-left:50px;}.sidebar .logo-container>img{max-width:35px;max-height:35px;}.sidebar-menu{position:fixed;z-index:10;font-size:2rem;cursor:pointer;width:45px;left:0;text-align:center;display:block;border-bottom:1px solid;border-right:1px solid;height:45px;}.rustdoc.source>.sidebar>.sidebar-menu{display:none;}.sidebar-elems{position:fixed;z-index:1;left:0;top:45px;bottom:0;overflow-y:auto;border-right:1px solid;display:none;}.sidebar>.block.version{border-bottom:none;margin-top:12px;margin-bottom:0;}nav.sub{width:calc(100% - 32px);float:right;}.content{margin-left:0px;}#main,#search{margin-top:45px;padding:0;}.content .in-band{width:100%;}.content h4>.out-of-band{position:inherit;}.toggle-wrapper>.collapse-toggle{left:0px;}.toggle-wrapper{height:1.5em;}#search{margin-left:0;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{display:flex;}.anchor{display:none !important;}h1.fqn{overflow:initial;}.theme-picker{left:10px;top:54px;z-index:1;}h4>.notable-traits{position:absolute;left:-22px;top:24px;}#titles>button>div.count{float:left;width:100%;}#titles{height:50px;}.sidebar.mobile{position:fixed;width:100%;margin-left:0;background-color:rgba(0,0,0,0);height:100%;}.sidebar.mobile>div.version{overflow:hidden;max-height:33px;}.sidebar{width:calc(100% + 30px);}.show-it{display:block;width:246px;}.show-it>.block.items{margin:8px 0;}.show-it>.block.items>ul{margin:0;}.show-it>.block.items>ul>li{text-align:center;margin:2px 0;}.show-it>.block.items>ul>li>a{font-size:21px;}#sidebar-filler{position:fixed;left:45px;width:calc(100% - 45px);top:0;height:45px;z-index:-1;border-bottom:1px solid;}.collapse-toggle{left:-20px;}.impl>.collapse-toggle{left:-10px;}#all-types{margin:10px;}#sidebar-toggle{top:100px;width:30px;font-size:1.5rem;text-align:center;padding:0;}#source-sidebar{z-index:11;}#main>.line-numbers{margin-top:0;}.notable-traits .notable-traits-tooltiptext{left:0;top:100%;}.help-button{display:none;}.search-container>div{width:calc(100% - 32px);}}@media print{nav.sub,.content .out-of-band,.collapse-toggle{display:none;}}@media (max-width:464px){#titles,#titles>button{height:73px;}#main,#search{margin-top:100px;}#main>table:not(.table-display) td{word-break:break-word;width:50%;}.search-container>div{display:block;width:calc(100% - 37px);}#crate-search{width:100%;border-radius:4px;border:0;}#crate-search+.search-input{width:calc(100% + 71px);margin-left:-36px;}#theme-picker,#settings-menu{padding:5px;width:31px;height:31px;}#theme-picker{margin-top:-2px;}#settings-menu{top:7px;}.docblock{margin-left:12px;}}h3.notable{margin:0;margin-bottom:13px;font-size:19px;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px;border-radius:3px;box-shadow:inset 0 -1px 0;cursor:default;}.hidden-by-impl-hider,.hidden-by-usual-hider{display:none !important;}#implementations-list>h3>span.in-band{width:100%;}.table-display{width:100%;border:0;border-collapse:collapse;border-spacing:0;font-size:16px;}.table-display tr td:first-child{padding-right:0;}.table-display tr td:last-child{float:right;}.table-display .out-of-band{position:relative;font-size:19px;display:block;}#implementors-list>.impl-items .table-display .out-of-band{font-size:17px;}.table-display td:hover .anchor{display:block;top:2px;left:-5px;}#main>ul{padding-left:10px;}#main>ul>li{list-style:none;}.non-exhaustive{margin-bottom:1em;}div.children{padding-left:27px;display:none;}div.name{cursor:pointer;position:relative;margin-left:16px;}div.files>a{display:block;padding:0 3px;}div.files>a:hover,div.name:hover{background-color:#a14b4b;}div.name.expand+.children{display:block;}div.name::before{content:"\25B6";padding-left:4px;font-size:0.7em;position:absolute;left:-16px;top:4px;}div.name.expand::before{transform:rotate(90deg);left:-15px;top:2px;}.type-decl>pre>.toggle-wrapper.toggle-attributes.top-attr{margin-left:0 !important;}.type-decl>pre>.docblock.attributes.top-attr{margin-left:1.8em !important;}.type-decl>pre>.toggle-attributes{margin-left:2.2em;}.type-decl>pre>.docblock.attributes{margin-left:4em;} \ No newline at end of file + @font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular.woff2") format("woff2"),url("FiraSans-Regular.woff") format('woff');font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium.woff2") format("woff2"),url("FiraSans-Medium.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular.ttf.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It.ttf.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold.ttf.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular.ttf.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It.ttf.woff") format('woff');font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold.ttf.woff") format('woff');font-display:swap;}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}html{content:"";}@media (prefers-color-scheme:light){html{content:"light";}}@media (prefers-color-scheme:dark){html{content:"dark";}}body{font:16px/1.4 "Source Serif 4",serif;margin:0;position:relative;padding:10px 15px 20px 15px;-webkit-font-feature-settings:"kern","liga";-moz-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";}h1{font-size:1.5em;}h2{font-size:1.4em;}h3{font-size:1.3em;}h1,h2,h3:not(.impl):not(.method):not(.type):not(.tymethod):not(.notable),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){font-weight:500;margin:20px 0 15px 0;padding-bottom:6px;}h1.fqn{display:flex;border-bottom:1px dashed;margin-top:0;padding-left:1px;}h1.fqn>.in-band>a:hover{text-decoration:underline;}h2,h3:not(.impl):not(.method):not(.type):not(.tymethod),h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant){border-bottom:1px solid;}h3.impl,h3.method,h4.method,h3.type,h4.type,h4.associatedconstant{flex-basis:100%;font-weight:600;margin-top:16px;margin-bottom:10px;position:relative;}h3.impl,h3.method,h4.method.trait-impl,h3.type,h4.type.trait-impl,h4.associatedconstant.trait-impl{padding-left:15px;}h1,h2,h3,h4,.sidebar,a.source,.search-input,.content table td:first-child>a,.collapse-toggle,div.item-list .out-of-band,#source-sidebar,#sidebar-toggle,#main>ul.docblock>li>a{font-family:"Fira Sans",Arial,sans-serif;}.content ul.crate a.crate{font-size:16px/1.6;font-family:"Fira Sans",Arial,sans-serif;}ol,ul{padding-left:25px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.6em;}p{margin:0 0 .6em 0;}summary{outline:none;}code,pre,a.test-arrow{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.1em;}.docblock pre code,.docblock-short pre code{padding:0;padding-right:1ex;}pre{padding:14px;}.source .content pre{padding:20px;}img{max-width:100%;}li{position:relative;}.source .content{margin-top:50px;max-width:none;overflow:visible;margin-left:0px;min-width:70em;}nav.sub{font-size:16px;text-transform:uppercase;}.sidebar{width:200px;position:fixed;left:0;top:0;bottom:0;overflow:auto;}*{scrollbar-width:initial;}.sidebar{scrollbar-width:thin;}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;}.sidebar .block>ul>li{margin-right:-10px;}.content,nav{max-width:960px;}.hidden{display:none !important;}.logo-container{height:100px;width:100px;position:relative;margin:20px auto;display:block;margin-top:10px;}.logo-container>img{max-width:100px;max-height:100px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:block;}.sidebar .location{border:1px solid;font-size:17px;margin:30px 10px 20px 10px;text-align:center;word-wrap:break-word;}.sidebar .version{font-size:15px;text-align:center;border-bottom:1px solid;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;}.location:empty{border:none;}.location a:first-child{font-weight:500;}.block{padding:0;margin-bottom:14px;}.block h2,.block h3{margin-top:0;margin-bottom:8px;text-align:center;}.block ul,.block li{margin:0 10px;padding:0;list-style:none;}.block a{display:block;text-overflow:ellipsis;overflow:hidden;line-height:15px;padding:7px 5px;font-size:14px;font-weight:300;transition:border 500ms ease-out;}.sidebar-title{border-top:1px solid;border-bottom:1px solid;text-align:center;font-size:17px;margin-bottom:5px;}.sidebar-links{margin-bottom:15px;}.sidebar-links>a{padding-left:10px;width:100%;}.sidebar-menu{display:none;}.content{padding:15px 0;}.source .content pre.rust{white-space:pre;overflow:auto;padding-left:0;}.rustdoc:not(.source) .example-wrap{display:inline-flex;margin-bottom:10px;}.example-wrap{position:relative;width:100%;}.example-wrap>pre.line-number{overflow:initial;border:1px solid;border-top-left-radius:5px;border-bottom-left-radius:5px;padding:13px 8px;text-align:right;}.rustdoc:not(.source) .example-wrap>pre.rust{width:100%;overflow-x:auto;}.rustdoc:not(.source) .example-wrap>pre{margin:0;}#search{margin-left:230px;position:relative;}#results>table{width:100%;table-layout:fixed;}.content pre.line-numbers{float:left;border:none;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers span{cursor:pointer;}.docblock-short{overflow-wrap:anywhere;}.docblock-short p{display:inline;}.docblock-short p{overflow:hidden;text-overflow:ellipsis;margin:0;}.docblock>:not(pre)>code,.docblock-short>:not(pre)>code{white-space:pre-wrap;}.docblock h1,.docblock h2,.docblock h3,.docblock h4,.docblock h5{border-bottom:1px solid;}#main>.docblock h1{font-size:1.3em;}#main>.docblock h2{font-size:1.15em;}#main>.docblock h3,#main>.docblock h4,#main>.docblock h5{font-size:1em;}#main>h2+div,#main>h2+h3,#main>h3+div{display:none;flex-wrap:wrap;}.docblock h1{font-size:1em;}.docblock h2{font-size:0.95em;}.docblock h3,.docblock h4,.docblock h5{font-size:0.9em;}.docblock{margin-left:24px;position:relative;}.content .out-of-band{flex-grow:0;text-align:right;font-size:23px;margin:0px;padding:0 0 0 12px;font-weight:normal;}h3.impl>.out-of-band{font-size:21px;}h4.method>.out-of-band{font-size:19px;}h4>code,h3>code,.invisible>code{max-width:calc(100% - 41px);display:block;}.invisible{width:100%;display:inline-block;}.content .in-band{flex-grow:1;margin:0px;padding:0px;}.in-band>code{display:inline-block;}#main{position:relative;}#main>.since{top:inherit;font-family:"Fira Sans",Arial,sans-serif;}.content table:not(.table-display){border-spacing:0 5px;}.content td{vertical-align:top;}.content td:first-child{padding-right:20px;}.content td p:first-child{margin-top:0;}.content td h1,.content td h2{margin-left:0;font-size:1.1em;}.content tr:first-child td{border-top:0;}.docblock table{margin:.5em 0;width:calc(100% - 2px);border:1px dashed;}.docblock table td{padding:.5em;border:1px dashed;}.docblock table th{padding:.5em;text-align:left;border:1px solid;}.fields+table{margin-bottom:1em;}.content .item-list{list-style-type:none;padding:0;}.content .multi-column{-moz-column-count:5;-moz-column-gap:2.5em;-webkit-column-count:5;-webkit-column-gap:2.5em;column-count:5;column-gap:2.5em;}.content .multi-column li{width:100%;display:inline-block;}.content .method{font-size:1em;position:relative;}.content .method .where,.content .fn .where,.content .where.fmt-newline{display:block;font-size:0.8em;}.content .methods>div:not(.notable-traits){margin-left:40px;margin-bottom:15px;}.content .docblock>.impl-items{margin-left:20px;margin-top:-34px;}.content .docblock>.impl-items>h4{border-bottom:0;}.content .docblock>.impl-items .table-display{margin:0;}.content .docblock>.impl-items table td{padding:0;}.toggle-wrapper.marg-left>.collapse-toggle{left:-24px;}.content .docblock>.impl-items .table-display,.impl-items table td{border:none;}.content .item-info code{font-size:90%;}.content .item-info{position:relative;margin-left:33px;margin-top:-13px;}.sub-variant>div>.item-info{margin-top:initial;}.content .item-info::before{content:'⬑';font-size:25px;position:absolute;top:-6px;left:-19px;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{margin-left:20px;}.content .impl-items .docblock,.content .impl-items .item-info{margin-bottom:.6em;}.content .impl-items>.item-info{margin-left:40px;}.methods>.item-info,.content .impl-items>.item-info{margin-top:-8px;}.impl-items{flex-basis:100%;}#main>.item-info{margin-top:0;}nav:not(.sidebar){border-bottom:1px solid;padding-bottom:10px;margin-bottom:10px;}nav.main{padding:20px 0;text-align:center;}nav.main .current{border-top:1px solid;border-bottom:1px solid;}nav.main .separator{border:1px solid;display:inline-block;height:23px;margin:0 20px;}nav.sum{text-align:right;}nav.sub form{display:inline;}nav.sub,.content{margin-left:230px;}a{text-decoration:none;background:transparent;}.small-section-header:hover>.anchor{display:initial;}.in-band:hover>.anchor,.impl:hover>.anchor,.method.trait-impl:hover>.anchor,.type.trait-impl:hover>.anchor,.associatedconstant.trait-impl:hover>.anchor{display:inline-block;position:absolute;}.anchor{display:none;position:absolute;left:-7px;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-28px;padding-right:10px;}.anchor:before{content:'\2002\00a7\2002';}.docblock a:not(.srclink):not(.test-arrow):hover,.docblock-short a:not(.srclink):not(.test-arrow):hover,.item-info a{text-decoration:underline;}.invisible>.srclink,h4>code+.srclink,h3>code+.srclink{position:absolute;top:0;right:0;font-size:17px;font-weight:normal;}.block a.current.crate{font-weight:500;}.search-container{position:relative;}.search-container>div{display:inline-flex;width:calc(100% - 63px);}#crate-search{min-width:115px;margin-top:5px;padding:6px;padding-right:19px;flex:none;border:0;border-right:0;border-radius:4px 0 0 4px;outline:none;cursor:pointer;border-right:1px solid;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;text-overflow:"";background-repeat:no-repeat;background-color:transparent;background-size:20px;background-position:calc(100% - 1px) 56%;}.search-container>.top-button{position:absolute;right:0;top:10px;}.search-input{-moz-box-sizing:border-box !important;box-sizing:border-box !important;outline:none;border:none;border-radius:1px;margin-top:5px;padding:10px 16px;font-size:17px;transition:border-color 300ms ease;transition:border-radius 300ms ease-in-out;transition:box-shadow 300ms ease-in-out;width:100%;}#crate-search+.search-input{border-radius:0 1px 1px 0;width:calc(100% - 32px);}.search-input:focus{border-radius:2px;border:0;outline:0;}.search-results .desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;}.search-results a{display:block;}.content .search-results td:first-child{padding-right:0;width:50%;}.content .search-results td:first-child a{padding-right:10px;}.content .search-results td:first-child a:after{clear:both;content:"";display:block;}.content .search-results td:first-child a span{float:left;}tr.result span.primitive::after{content:' (primitive type)';font-style:italic;}tr.result span.keyword::after{content:' (keyword)';font-style:italic;}body.blur>:not(#help){filter:blur(8px);-webkit-filter:blur(8px);opacity:.7;}#help{width:100%;height:100vh;position:fixed;top:0;left:0;display:flex;justify-content:center;align-items:center;}#help>div{flex:0 0 auto;box-shadow:0 0 6px rgba(0,0,0,.2);width:550px;height:auto;border:1px solid;}#help dt{float:left;clear:left;display:block;margin-right:0.5rem;}#help>div>span{text-align:center;display:block;margin:10px 0;font-size:18px;border-bottom:1px solid #ccc;padding-bottom:4px;margin-bottom:6px;}#help dd{margin:5px 35px;}#help .infos{padding-left:0;}#help h1,#help h2{margin-top:0;}#help>div div{width:50%;float:left;padding:0 20px 20px 17px;;}.stab{display:table;border-width:1px;border-style:solid;padding:3px;margin-bottom:5px;font-size:90%;}.stab p{display:inline;}.stab summary{display:list-item;}.stab .emoji{font-size:1.5em;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.module-item .stab,.import-item .stab{border-radius:3px;display:inline-block;font-size:80%;line-height:1.2;margin-bottom:0;margin-right:.3em;padding:2px;vertical-align:text-bottom;}.module-item.unstable,.import-item.unstable{opacity:0.65;}.since{font-weight:normal;font-size:initial;position:absolute;right:0;top:0;}.impl-items .since,.impl .since,.methods .since{flex-grow:0;padding-left:12px;padding-right:2px;position:initial;}.impl-items .srclink,.impl .srclink,.methods .srclink{flex-grow:0;font-size:17px;font-weight:normal;}.impl-items code,.impl code,.methods code{flex-grow:1;}.impl-items h4,h4.impl,h3.impl,.methods h3{display:flex;flex-basis:100%;font-size:16px;margin-bottom:12px;justify-content:space-between;}.variants_table{width:100%;}.variants_table tbody tr td:first-child{width:1%;}td.summary-column{width:100%;}.summary{padding-right:0px;}pre.rust .question-mark{font-weight:bold;}a.test-arrow{display:inline-block;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:130%;top:5px;right:5px;z-index:1;}a.test-arrow:hover{text-decoration:none;}.section-header:hover a:before{position:absolute;left:-25px;padding-right:10px;content:'\2002\00a7\2002';}.section-header:hover a{text-decoration:none;}.section-header a{color:inherit;}.code-attribute{font-weight:300;}.collapse-toggle{font-weight:300;position:absolute;left:-23px;top:0;}h3>.collapse-toggle,h4>.collapse-toggle{font-size:0.8em;top:5px;}.toggle-wrapper>.collapse-toggle{left:-24px;margin-top:0px;}.toggle-wrapper{position:relative;margin-top:0;}.toggle-wrapper.collapsed{height:25px;transition:height .2s;margin-bottom:.6em;}.collapse-toggle>.inner{display:inline-block;width:1.2ch;text-align:center;}.collapse-toggle.hidden-default{position:relative;margin-left:20px;}.since+.srclink{display:table-cell;padding-left:10px;}.item-spacer{width:100%;height:12px;}.out-of-band>span.since{position:initial;font-size:20px;margin-right:5px;}.toggle-wrapper>.collapse-toggle{left:0;}.variant+.toggle-wrapper+.docblock>p{margin-top:5px;}.sub-variant,.sub-variant>h3{margin-top:0px !important;padding-top:1px;}#main>details>.sub-variant>h3{font-size:15px;margin-left:25px;margin-bottom:5px;}.sub-variant>div{margin-left:20px;margin-bottom:10px;}.sub-variant>div>span{display:block;position:relative;}.toggle-label{display:inline-block;margin-left:4px;margin-top:3px;}.docblock>.section-header:first-child{margin-left:15px;margin-top:0;}.docblock>.section-header:first-child:hover>a:before{left:-10px;}#main>.variant,#main>.structfield{display:block;}:target>code{opacity:1;}.information{position:absolute;left:-25px;margin-top:7px;z-index:1;}.tooltip{position:relative;display:inline-block;cursor:pointer;}.tooltip::after{display:none;text-align:center;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;font-size:16px;}.tooltip.ignore::after{content:"This example is not tested";}.tooltip.compile_fail::after{content:"This example deliberately fails to compile";}.tooltip.should_panic::after{content:"This example panics";}.tooltip.edition::after{content:"This code runs with edition " attr(data-edition);}.tooltip::before{content:" ";position:absolute;top:50%;left:16px;margin-top:-5px;border-width:5px;border-style:solid;display:none;}.tooltip:hover::before,.tooltip:hover::after{display:inline;}.tooltip.compile_fail,.tooltip.should_panic,.tooltip.ignore{font-weight:bold;font-size:20px;}.notable-traits-tooltip{display:inline-block;cursor:pointer;}.notable-traits:hover .notable-traits-tooltiptext,.notable-traits .notable-traits-tooltiptext.force-tooltip{display:inline-block;}.notable-traits .notable-traits-tooltiptext{display:none;padding:5px 3px 3px 3px;border-radius:6px;margin-left:5px;z-index:10;font-size:16px;cursor:default;position:absolute;border:1px solid;}.notable-traits-tooltip::after{content:"\00a0\00a0\00a0";}.notable-traits .notable,.notable-traits .docblock{margin:0;}.notable-traits .docblock code.content{margin:0;padding:0;font-size:20px;}pre.rust.rust-example-rendered{position:relative;}pre.rust{tab-size:4;-moz-tab-size:4;}.search-failed{text-align:center;margin-top:20px;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#titles{height:35px;}#titles>button{float:left;width:33.3%;text-align:center;font-size:18px;cursor:pointer;border:0;border-top:2px solid;}#titles>button:not(:last-child){margin-right:1px;width:calc(33.3% - 1px);}#titles>button>div.count{display:inline-block;font-size:16px;}.notable-traits{cursor:pointer;z-index:2;margin-left:5px;}h4>.notable-traits{position:absolute;left:-44px;top:2px;}#all-types{text-align:center;border:1px solid;margin:0 10px;margin-bottom:10px;display:block;border-radius:7px;}#all-types>p{margin:5px 0;}#sidebar-toggle{position:fixed;top:30px;left:300px;z-index:10;padding:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;cursor:pointer;font-weight:bold;transition:left .5s;font-size:1.2em;border:1px solid;border-left:0;}#source-sidebar{position:fixed;top:0;bottom:0;left:0;width:300px;z-index:1;overflow:auto;transition:left .5s;border-right:1px solid;}#source-sidebar>.title{font-size:1.5em;text-align:center;border-bottom:1px solid;margin-bottom:6px;}.theme-picker{position:absolute;left:211px;top:19px;}.theme-picker button{outline:none;}#settings-menu,.help-button{position:absolute;top:10px;}#settings-menu{right:0;outline:none;}#theme-picker,#settings-menu,.help-button,#copy-path{padding:4px;width:27px;height:29px;border:1px solid;border-radius:3px;cursor:pointer;}.help-button{right:30px;font-family:"Fira Sans",Arial,sans-serif;text-align:center;font-size:17px;padding-top:2px;}#copy-path{height:30px;font-size:18px;margin-left:10px;padding:0 6px;width:28px;}#theme-choices{display:none;position:absolute;left:0;top:28px;border:1px solid;border-radius:3px;z-index:1;cursor:pointer;}#theme-choices>button{border:none;width:100%;padding:4px 8px;text-align:center;background:rgba(0,0,0,0);}#theme-choices>button:not(:first-child){border-top:1px solid;}@media (min-width:701px){.docblock>.information:first-child>.tooltip{margin-top:16px;}}@media (max-width:700px){body{padding-top:0px;}.rustdoc>.sidebar{height:45px;min-height:40px;margin:0;margin-left:-15px;padding:0 15px;position:static;z-index:11;}.sidebar>.location{float:right;margin:0px;margin-top:2px;padding:3px 10px 1px 10px;min-height:39px;background:inherit;text-align:left;font-size:24px;}.sidebar .location:empty{padding:0;}.sidebar .logo-container{width:35px;height:35px;margin-top:5px;margin-bottom:5px;float:left;margin-left:50px;}.sidebar .logo-container>img{max-width:35px;max-height:35px;}.sidebar-menu{position:fixed;z-index:10;font-size:2rem;cursor:pointer;width:45px;left:0;text-align:center;display:block;border-bottom:1px solid;border-right:1px solid;height:45px;}.rustdoc.source>.sidebar>.sidebar-menu{display:none;}.sidebar-elems{position:fixed;z-index:1;left:0;top:45px;bottom:0;overflow-y:auto;border-right:1px solid;display:none;}.sidebar>.block.version{border-bottom:none;margin-top:12px;margin-bottom:0;}nav.sub{width:calc(100% - 32px);float:right;}.content{margin-left:0px;}#main,#search{margin-top:45px;padding:0;}.content h4>.out-of-band{position:inherit;}.toggle-wrapper>.collapse-toggle{left:0px;}.toggle-wrapper{height:1.5em;}#search{margin-left:0;}.content .impl-items .method,.content .impl-items>.type,.impl-items>.associatedconstant{display:flex;}.anchor{display:none !important;}.theme-picker{left:10px;top:54px;z-index:1;}h4>.notable-traits{position:absolute;left:-22px;top:24px;}#titles>button>div.count{float:left;width:100%;}#titles{height:50px;}.sidebar.mobile{position:fixed;width:100%;margin-left:0;background-color:rgba(0,0,0,0);height:100%;}.sidebar.mobile>div.version{overflow:hidden;max-height:33px;}.sidebar{width:calc(100% + 30px);}.show-it{display:block;width:246px;}.show-it>.block.items{margin:8px 0;}.show-it>.block.items>ul{margin:0;}.show-it>.block.items>ul>li{text-align:center;margin:2px 0;}.show-it>.block.items>ul>li>a{font-size:21px;}#sidebar-filler{position:fixed;left:45px;width:calc(100% - 45px);top:0;height:45px;z-index:-1;border-bottom:1px solid;}.collapse-toggle{left:-20px;}.impl>.collapse-toggle{left:-10px;}.item-list>details.rustdoc-toggle>summary:not(.hideme)::before{left:-10px;}#all-types{margin:10px;}#sidebar-toggle{top:100px;width:30px;font-size:1.5rem;text-align:center;padding:0;}#source-sidebar{z-index:11;}#main>.line-numbers{margin-top:0;}.notable-traits .notable-traits-tooltiptext{left:0;top:100%;}.help-button{display:none;}.search-container>div{width:calc(100% - 32px);}}@media print{nav.sub,.content .out-of-band,.collapse-toggle{display:none;}}@media (max-width:464px){#titles,#titles>button{height:73px;}#main,#search{margin-top:100px;}#main>table:not(.table-display) td{word-break:break-word;width:50%;}.search-container>div{display:block;width:calc(100% - 37px);}#crate-search{width:100%;border-radius:4px;border:0;}#crate-search+.search-input{width:calc(100% + 71px);margin-left:-36px;}#theme-picker,#settings-menu{padding:5px;width:31px;height:31px;}#theme-picker{margin-top:-2px;}#settings-menu{top:7px;}.docblock{margin-left:12px;}}h3.notable{margin:0;margin-bottom:13px;font-size:19px;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px;border-radius:3px;box-shadow:inset 0 -1px 0;cursor:default;}.hidden-by-impl-hider,.hidden-by-usual-hider{display:none !important;}#implementations-list>h3>span.in-band{width:100%;}.table-display{width:100%;border:0;border-collapse:collapse;border-spacing:0;font-size:16px;}.table-display tr td:first-child{padding-right:0;}.table-display tr td:last-child{float:right;}.table-display .out-of-band{position:relative;font-size:19px;display:block;}#implementors-list>.impl-items .table-display .out-of-band{font-size:17px;}.table-display td:hover .anchor{display:block;top:2px;left:-5px;}#main>ul{padding-left:10px;}#main>ul>li{list-style:none;}.non-exhaustive{margin-bottom:1em;}div.children{padding-left:27px;display:none;}div.name{cursor:pointer;position:relative;margin-left:16px;}div.files>a{display:block;padding:0 3px;}div.files>a:hover,div.name:hover{background-color:#a14b4b;}div.name.expand+.children{display:block;}div.name::before{content:"\25B6";padding-left:4px;font-size:0.7em;position:absolute;left:-16px;top:4px;}div.name.expand::before{transform:rotate(90deg);left:-15px;top:2px;}details.rustdoc-toggle>summary.hideme{cursor:pointer;}details.rustdoc-toggle>summary::-webkit-details-marker{display:none;}details.rustdoc-toggle>summary.hideme>span{margin-left:9px;}details.rustdoc-toggle>summary::before{content:"[+]";font-weight:300;font-size:0.8em;letter-spacing:1px;cursor:pointer;}details.rustdoc-toggle>summary.hideme::before{position:relative;}details.rustdoc-toggle>summary:not(.hideme)::before{position:absolute;left:-23px;}details.rustdoc-toggle[open] >summary.hideme{position:absolute;}details.rustdoc-toggle[open]{position:relative;}details.rustdoc-toggle[open] >summary.hideme>span{display:none;}details.rustdoc-toggle[open] >summary::before{content:"[−]";display:inline;} \ No newline at end of file diff --git a/search-index.js b/search-index.js index 41771707..0699eaa3 100644 --- a/search-index.js +++ b/search-index.js @@ -1,5 +1,5 @@ var searchIndex = JSON.parse('{\ -"mcaptcha":{"doc":"","i":[[0,"api","mcaptcha","",null,null],[0,"v1","mcaptcha::api","",null,null],[0,"account","mcaptcha::api::v1","",null,null],[0,"delete","mcaptcha::api::v1::account","",null,null],[3,"delete_account","mcaptcha::api::v1::account::delete","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"email","mcaptcha::api::v1::account","",null,null],[3,"Email","mcaptcha::api::v1::account::email","",null,null],[12,"email","","",0,null],[3,"email_exists","","",null,null],[3,"set_email","","update email",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"secret","mcaptcha::api::v1::account","",null,null],[3,"Secret","mcaptcha::api::v1::account::secret","",null,null],[12,"secret","","",1,null],[3,"get_secret","","",null,null],[3,"update_user_secret","","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"username","mcaptcha::api::v1::account","",null,null],[3,"username_exists","mcaptcha::api::v1::account::username","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"routes","mcaptcha::api::v1::account","",null,null],[3,"Account","mcaptcha::api::v1::account::routes","",null,null],[12,"delete","","",2,null],[12,"email_exists","","",2,null],[12,"get_secret","","",2,null],[12,"update_email","","",2,null],[12,"update_secret","","",2,null],[12,"username_exists","","",2,null],[11,"new","","",2,[[],["account",3]]],[3,"AccountCheckPayload","mcaptcha::api::v1::account","",null,null],[12,"val","","",3,null],[3,"AccountCheckResp","","",null,null],[12,"exists","","",4,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"auth","mcaptcha::api::v1","",null,null],[0,"routes","mcaptcha::api::v1::auth","",null,null],[3,"Auth","mcaptcha::api::v1::auth::routes","",null,null],[12,"logout","","",5,null],[12,"login","","",5,null],[12,"register","","",5,null],[11,"new","","",5,[[],["auth",3]]],[0,"runners","mcaptcha::api::v1::auth","",null,null],[3,"Register","mcaptcha::api::v1::auth::runners","",null,null],[12,"username","","",6,null],[12,"password","","",6,null],[12,"confirm_password","","",6,null],[12,"email","","",6,null],[3,"Login","","",null,null],[12,"login","","",7,null],[12,"password","","",7,null],[3,"Password","","",null,null],[12,"password","","",8,null],[5,"login_runner","","returns Ok(()) when everything checks out and the user is …",null,[[["appdata",6],["login",3]]]],[5,"register_runner","","",null,[[["appdata",6],["register",3]]]],[5,"services","mcaptcha::api::v1::auth","",null,[[["serviceconfig",3]]]],[3,"register","","",null,null],[3,"login","","",null,null],[3,"signout","","",null,null],[0,"mcaptcha","mcaptcha::api::v1","",null,null],[0,"captcha","mcaptcha::api::v1::mcaptcha","",null,null],[0,"routes","mcaptcha::api::v1::mcaptcha::captcha","",null,null],[3,"MCaptcha","mcaptcha::api::v1::mcaptcha::captcha::routes","",null,null],[12,"delete","","",9,null],[12,"get_token","","",9,null],[12,"update_key","","",9,null],[11,"new","","",9,[[],["mcaptcha",3]]],[5,"services","mcaptcha::api::v1::mcaptcha::captcha","",null,[[["serviceconfig",3]]]],[3,"MCaptchaID","","",null,null],[12,"name","","",10,null],[3,"MCaptchaDetails","","",null,null],[12,"name","","",11,null],[12,"key","","",11,null],[5,"add_mcaptcha_util","","",null,[[["u32",15],["identity",3],["appdata",6],["str",15]]]],[3,"update_token","","",null,null],[5,"update_token_helper","","",null,[[["appdata",6],["str",15]]]],[3,"get_token","","",null,null],[3,"delete_mcaptcha","","",null,null],[0,"duration","mcaptcha::api::v1::mcaptcha","",null,null],[0,"routes","mcaptcha::api::v1::mcaptcha::duration","",null,null],[3,"Duration","mcaptcha::api::v1::mcaptcha::duration::routes","",null,null],[12,"update","","",12,null],[12,"get","","",12,null],[11,"new","","",12,[[],["duration",3]]],[3,"UpdateDuration","mcaptcha::api::v1::mcaptcha::duration","",null,null],[12,"key","","",13,null],[12,"duration","","",13,null],[3,"update_duration","","",null,null],[3,"GetDurationResp","","",null,null],[12,"duration","","",14,null],[3,"GetDuration","","",null,null],[12,"token","","",15,null],[3,"get_duration","","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"levels","mcaptcha::api::v1::mcaptcha","",null,null],[0,"routes","mcaptcha::api::v1::mcaptcha::levels","",null,null],[3,"Levels","mcaptcha::api::v1::mcaptcha::levels::routes","",null,null],[12,"add","","",16,null],[12,"delete","","",16,null],[12,"get","","",16,null],[12,"update","","",16,null],[11,"new","","",16,[[],["levels",3]]],[3,"AddLevels","mcaptcha::api::v1::mcaptcha::levels","",null,null],[12,"levels","","",17,null],[12,"duration","","",17,null],[12,"description","","",17,null],[5,"services","","",null,[[["serviceconfig",3]]]],[3,"add_levels","","",null,null],[3,"UpdateLevels","","",null,null],[12,"levels","","",18,null],[12,"key","","name is config_name",18,null],[3,"update_levels","","",null,null],[3,"delete_levels","","",null,null],[3,"get_levels","","",null,null],[3,"Levels","","",null,null],[12,"levels","","",19,null],[3,"I32Levels","","",null,null],[12,"difficulty_factor","","",20,null],[12,"visitor_threshold","","",20,null],[5,"get_levels_util","","",null,[[["appdata",6],["str",15]]]],[5,"get_random","mcaptcha::api::v1::mcaptcha","",null,[[["usize",15]],["string",3]]],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"meta","mcaptcha::api::v1","",null,null],[0,"routes","mcaptcha::api::v1::meta","",null,null],[3,"Meta","mcaptcha::api::v1::meta::routes","",null,null],[12,"build_details","","",21,null],[12,"health","","",21,null],[11,"new","","",21,[[]]],[3,"BuildDetails","mcaptcha::api::v1::meta","",null,null],[12,"version","","",22,null],[12,"git_commit_hash","","",22,null],[3,"BuildDetailsBuilder","","Builder for BuildDetails.",null,null],[12,"version","","",23,null],[12,"git_commit_hash","","",23,null],[11,"version","","",23,[[["str",15]]]],[11,"git_commit_hash","","",23,[[["str",15]]]],[11,"build","","Builds a new BuildDetails.",23,[[],[["builddetails",3],["builddetailsbuildererror",4],["result",4]]]],[4,"BuildDetailsBuilderError","","Error type for BuildDetailsBuilder",null,null],[13,"UninitializedField","","Uninitialized field",24,null],[13,"ValidationError","","Custom validation error",24,null],[3,"build_details","","emmits build details of the bninary",null,null],[3,"Health","","Health check return datatype",null,null],[12,"db","","",25,null],[12,"redis","","",25,null],[3,"HealthBuilder","","Builder for Health.",null,null],[12,"db","","",26,null],[12,"redis","","",26,null],[11,"db","","",26,[[["bool",15]]]],[11,"redis","","",26,[[["bool",15],["option",4]]]],[11,"build","","Builds a new Health.",26,[[],[["result",4],["health",3],["healthbuildererror",4]]]],[4,"HealthBuilderError","","Error type for HealthBuilder",null,null],[13,"UninitializedField","","Uninitialized field",27,null],[13,"ValidationError","","Custom validation error",27,null],[11,"is_redis","","",25,[[["option",4]],["bool",15]]],[3,"health","","checks all components of the system",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"notifications","mcaptcha::api::v1","",null,null],[0,"add","mcaptcha::api::v1::notifications","",null,null],[3,"AddNotification","mcaptcha::api::v1::notifications::add","",null,null],[12,"to","","",28,null],[12,"heading","","",28,null],[12,"message","","",28,null],[3,"add_notification","","route handler that adds a notification message",null,null],[0,"get","mcaptcha::api::v1::notifications","",null,null],[3,"Notification","mcaptcha::api::v1::notifications::get","",null,null],[12,"name","","",29,null],[12,"heading","","",29,null],[12,"message","","",29,null],[12,"received","","",29,null],[12,"id","","",29,null],[3,"NotificationResp","","",null,null],[12,"name","","",30,null],[12,"heading","","",30,null],[12,"message","","",30,null],[12,"received","","",30,null],[12,"id","","",30,null],[3,"get_notification","","route handler that gets all unread notifications",null,null],[0,"mark_read","mcaptcha::api::v1::notifications","",null,null],[3,"MarkReadReq","mcaptcha::api::v1::notifications::mark_read","",null,null],[12,"id","","",31,null],[3,"NotificationResp","","",null,null],[12,"name","","",32,null],[12,"heading","","",32,null],[12,"message","","",32,null],[12,"received","","",32,null],[12,"id","","",32,null],[3,"mark_read","","route handler that marks a notification read",null,null],[0,"routes","mcaptcha::api::v1::notifications","",null,null],[3,"Notifications","mcaptcha::api::v1::notifications::routes","",null,null],[12,"add","","",33,null],[12,"mark_read","","",33,null],[12,"get","","",33,null],[11,"new","","",33,[[],["notifications",3]]],[5,"services","mcaptcha::api::v1::notifications","",null,[[["serviceconfig",3]]]],[0,"pow","mcaptcha::api::v1","",null,null],[0,"get_config","mcaptcha::api::v1::pow","",null,null],[3,"GetConfigPayload","mcaptcha::api::v1::pow::get_config","",null,null],[12,"key","","",34,null],[3,"get_config","","get PoW configuration for an mcaptcha key",null,null],[5,"init_mcaptcha","","Call this when [MCaptcha][libmcaptcha::MCaptcha] is not …",null,[[["appdata",6],["str",15]]]],[0,"verify_pow","mcaptcha::api::v1::pow","PoW Verification module",null,null],[3,"ValidationToken","mcaptcha::api::v1::pow::verify_pow","validation token that clients receive as proof for …",null,null],[12,"token","","",35,null],[3,"verify_pow","","route handler that verifies PoW and issues a solution …",null,null],[0,"verify_token","mcaptcha::api::v1::pow","PoW success token module",null,null],[3,"CaptchaValidateResp","mcaptcha::api::v1::pow::verify_token","",null,null],[12,"valid","","",36,null],[3,"validate_captcha_token","","route hander that validates a PoW solution token",null,null],[0,"routes","mcaptcha::api::v1::pow","",null,null],[3,"PoW","mcaptcha::api::v1::pow::routes","",null,null],[12,"get_config","","",37,null],[12,"verify_pow","","",37,null],[12,"validate_captcha_token","","",37,null],[12,"scope","","",37,null],[11,"new","","",37,[[]]],[5,"services","mcaptcha::api::v1::pow","",null,[[["serviceconfig",3]]]],[0,"routes","mcaptcha::api::v1","",null,null],[17,"ROUTES","mcaptcha::api::v1::routes","",null,null],[3,"Routes","","",null,null],[12,"auth","","",38,null],[12,"account","","",38,null],[12,"levels","","",38,null],[12,"mcaptcha","","",38,null],[12,"duration","","",38,null],[12,"meta","","",38,null],[12,"pow","","",38,null],[12,"notifications","","",38,null],[11,"new","","",38,[[],["routes",3]]],[5,"services","mcaptcha::api::v1","",null,[[["serviceconfig",3]]]],[0,"data","mcaptcha","App data: redis cache, database connections, etc.",null,null],[4,"SystemGroup","mcaptcha::data","Represents mCaptcha cache and master system. When Redis …",null,null],[13,"Embedded","","",39,null],[13,"Redis","","",39,null],[11,"get_pow","","utility function to get difficulty factor of site id and …",39,[[["string",3]]]],[11,"verify_pow","","utility function to verify [Work]",39,[[["work",3]]]],[11,"validate_verification_tokens","","utility function to validate verification tokens",39,[[["verifycaptcharesult",3]]]],[11,"new_system","","",39,[[["save",8],["addr",3],["addr",3],["mastertrait",8]],[["mastertrait",8],["save",8],["system",3]]]],[11,"new","","",39,[[]]],[3,"Data","","App data",null,null],[12,"db","","databse pool",40,null],[12,"creds","","credential management configuration",40,null],[12,"captcha","","mCaptcha system: Redis cache, etc.",40,null],[12,"mailer","","email client",40,null],[11,"new","","create new instance of app data",40,[[]]],[11,"get_mailer","","",40,[[],[["asyncsmtptransport",3],["option",4]]]],[6,"Mailer","","Mailer data type AsyncSmtpTransport",null,null],[0,"docs","mcaptcha","",null,null],[0,"routes","mcaptcha::docs","",null,null],[3,"Docs","mcaptcha::docs::routes","",null,null],[12,"home","","",41,null],[12,"spec","","",41,null],[12,"assets","","",41,null],[11,"new","","",41,[[]]],[17,"DOCS","mcaptcha::docs","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[3,"Asset","","",null,null],[11,"get","","",42,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",42,[[]]],[5,"handle_embedded_file","","",null,[[["str",15]],["httpresponse",3]]],[5,"dist","","",null,[[["path",3],["string",3]]]],[5,"spec","","",null,[[]]],[5,"index","","",null,[[]]],[0,"errors","mcaptcha","",null,null],[4,"ServiceError","mcaptcha::errors","",null,null],[13,"InternalServerError","","",43,null],[13,"ClosedForRegistration","","",43,null],[13,"NotAnEmail","","",43,null],[13,"NotAUrl","","",43,null],[13,"WrongPassword","","",43,null],[13,"UsernameNotFound","","",43,null],[13,"AccountNotFound","","",43,null],[13,"ProfainityError","","when the value passed contains profainity",43,null],[13,"BlacklistError","","when the value passed contains blacklisted words see …",43,null],[13,"UsernameCaseMappedError","","when the value passed contains characters not present in …",43,null],[13,"PasswordTooShort","","",43,null],[13,"PasswordTooLong","","",43,null],[13,"PasswordsDontMatch","","",43,null],[13,"UsernameTaken","","when the a username is already taken",43,null],[13,"EmailTaken","","email is already taken",43,null],[13,"TokenNotFound","","when the a token name is already taken token not found",43,null],[13,"CaptchaError","","",43,null],[3,"ErrorToResponse","","",null,null],[12,"error","","",44,null],[6,"ServiceResult","","",null,null],[4,"PageError","","",null,null],[13,"InternalServerError","","",45,null],[13,"ServiceError","","",45,null],[6,"PageResult","","",null,null],[0,"middleware","mcaptcha","",null,null],[0,"auth","mcaptcha::middleware","",null,null],[3,"CheckLogin","mcaptcha::middleware::auth","",null,null],[3,"CheckLoginMiddleware","","",null,null],[12,"service","","",46,null],[0,"pages","mcaptcha","",null,null],[0,"auth","mcaptcha::pages","",null,null],[0,"login","mcaptcha::pages::auth","",null,null],[3,"IndexPage","mcaptcha::pages::auth::login","",null,null],[17,"PAGE","","",null,null],[3,"INDEX","","",null,null],[12,"__private_field","","",47,null],[3,"login","","",null,null],[0,"register","mcaptcha::pages::auth","",null,null],[3,"IndexPage","mcaptcha::pages::auth::register","",null,null],[17,"PAGE","","",null,null],[3,"INDEX","","",null,null],[12,"__private_field","","",48,null],[3,"join","","",null,null],[0,"routes","mcaptcha::pages::auth","",null,null],[3,"Auth","mcaptcha::pages::auth::routes","",null,null],[12,"login","","",49,null],[12,"join","","",49,null],[11,"new","","",49,[[],["auth",3]]],[5,"services","mcaptcha::pages::auth","",null,[[["serviceconfig",3]]]],[0,"errors","mcaptcha::pages","",null,null],[0,"routes","mcaptcha::pages::errors","",null,null],[3,"Errors","mcaptcha::pages::errors::routes","",null,null],[12,"internal_server_error","","",50,null],[12,"unknown_error","","",50,null],[11,"new","","",50,[[]]],[3,"ErrorPage","mcaptcha::pages::errors","",null,null],[12,"title","","",51,null],[12,"message","","",51,null],[17,"PAGE","","",null,null],[11,"new","","",51,[[["str",15]]]],[3,"INTERNAL_SERVER_ERROR_BODY","","",null,null],[12,"__private_field","","",52,null],[3,"UNKNOWN_ERROR_BODY","","",null,null],[12,"__private_field","","",53,null],[5,"error","","",null,[[["usize",15],["path",3]]]],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"panel","mcaptcha::pages","",null,null],[0,"sitekey","mcaptcha::pages::panel","",null,null],[0,"add","mcaptcha::pages::panel::sitekey","",null,null],[17,"PAGE","mcaptcha::pages::panel::sitekey::add","",null,null],[3,"INDEX","","",null,null],[12,"__private_field","","",54,null],[3,"IndexPage","","",null,null],[12,"levels","","",55,null],[12,"form_title","","",55,null],[12,"form_description","","",55,null],[12,"form_duration","","",55,null],[3,"add_sitekey","","",null,null],[0,"list","mcaptcha::pages::panel::sitekey","",null,null],[3,"IndexPage","mcaptcha::pages::panel::sitekey::list","",null,null],[12,"sitekeys","","",56,null],[17,"PAGE","","",null,null],[11,"new","","",56,[[["vec",3],["mcaptchadetails",3]]]],[3,"list_sitekeys","","render a list of all sitekeys that a user has",null,null],[5,"get_list_sitekeys","","utility function to get a list of all sitekeys that a …",null,[[["appdata",6],["identity",3]]]],[6,"SiteKeys","","",null,null],[0,"view","mcaptcha::pages::panel::sitekey","",null,null],[17,"PAGE","mcaptcha::pages::panel::sitekey::view","",null,null],[3,"McaptchaConfig","","",null,null],[12,"config_id","","",57,null],[12,"duration","","",57,null],[12,"name","","",57,null],[3,"Level","","",null,null],[12,"difficulty_factor","","",58,null],[12,"visitor_threshold","","",58,null],[3,"IndexPage","","",null,null],[12,"duration","","",59,null],[12,"name","","",59,null],[12,"key","","",59,null],[12,"levels","","",59,null],[11,"new","","",59,[[["mcaptchaconfig",3],["level",3],["vec",3],["string",3]]]],[3,"view_sitekey","","route handler that renders individual views for sitekeys",null,null],[0,"routes","mcaptcha::pages::panel::sitekey","",null,null],[3,"Sitekey","mcaptcha::pages::panel::sitekey::routes","",null,null],[12,"list","","",60,null],[12,"add","","",60,null],[12,"view","","",60,null],[11,"new","","",60,[[]]],[5,"services","mcaptcha::pages::panel::sitekey","",null,[[["serviceconfig",3]]]],[0,"routes","mcaptcha::pages::panel","",null,null],[3,"Panel","mcaptcha::pages::panel::routes","",null,null],[12,"home","","",61,null],[12,"sitekey","","",61,null],[11,"new","","",61,[[]]],[3,"IndexPage","mcaptcha::pages::panel","",null,null],[12,"sitekeys","","",62,null],[11,"new","","",62,[[["vec",3],["mcaptchadetails",3]]]],[17,"PAGE","","",null,null],[3,"panel","","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"routes","mcaptcha::pages","",null,null],[17,"ROUTES","mcaptcha::pages::routes","",null,null],[3,"Routes","","",null,null],[12,"home","","",63,null],[12,"auth","","",63,null],[12,"panel","","",63,null],[12,"errors","","",63,null],[12,"about","","",63,null],[12,"thanks","","",63,null],[12,"donate","","",63,null],[12,"security","","",63,null],[12,"privacy","","",63,null],[11,"new","","",63,[[],["routes",3]]],[17,"NAME","mcaptcha::pages","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[0,"routes","mcaptcha","",null,null],[4,"Methods","mcaptcha::routes","",null,null],[13,"Get","","GET hander",64,null],[13,"Post","","POST handler",64,null],[13,"ProtectGet","","Protected GET handler",64,null],[13,"ProtectPost","","Protected POST handler",64,null],[0,"settings","mcaptcha","",null,null],[3,"Server","mcaptcha::settings","",null,null],[12,"allow_registration","","",65,null],[12,"port","","",65,null],[12,"domain","","",65,null],[12,"cookie_secret","","",65,null],[12,"ip","","",65,null],[12,"url_prefix","","",65,null],[3,"Captcha","","",null,null],[12,"salt","","",66,null],[12,"gc","","",66,null],[3,"Smtp","","",null,null],[12,"from","","",67,null],[12,"url","","",67,null],[12,"username","","",67,null],[12,"password","","",67,null],[11,"get_ip","","",65,[[],["string",3]]],[3,"DatabaseBuilder","","",null,null],[12,"port","","",68,null],[12,"hostname","","",68,null],[12,"username","","",68,null],[12,"password","","",68,null],[12,"name","","",68,null],[12,"url","","",68,null],[11,"extract_database_url","","",68,[[["url",3]]]],[3,"Database","","",null,null],[12,"url","","",69,null],[12,"pool","","",69,null],[3,"Redis","","",null,null],[12,"url","","",70,null],[12,"pool","","",70,null],[3,"Settings","","",null,null],[12,"debug","","",71,null],[12,"database","","",71,null],[12,"redis","","",71,null],[12,"server","","",71,null],[12,"pow","","",71,null],[12,"source_code","","",71,null],[12,"smtp","","",71,null],[11,"new","","",71,[[],[["configerror",4],["result",4]]]],[5,"check_url","","",null,[[["config",3]]]],[5,"set_from_database_url","","",null,[[["databasebuilder",3],["config",3]]]],[5,"set_database_url","","",null,[[["config",3]]]],[0,"static_assets","mcaptcha","",null,null],[0,"filemap","mcaptcha::static_assets","",null,null],[3,"FileMap","mcaptcha::static_assets::filemap","",null,null],[12,"files","","",72,null],[11,"new","","",72,[[]]],[11,"get","","",72,[[["str",15]],[["option",4],["str",15]]]],[0,"static_files","mcaptcha::static_assets","",null,null],[3,"Asset","mcaptcha::static_assets::static_files","",null,null],[11,"get","","",73,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",73,[[]]],[5,"handle_assets","","",null,[[["str",15]],["httpresponse",3]]],[3,"static_files","","",null,null],[3,"Favicons","","",null,null],[11,"get","","",74,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",74,[[]]],[5,"handle_favicons","","",null,[[["str",15]],["httpresponse",3]]],[3,"favicons","","",null,null],[5,"services","mcaptcha::static_assets","",null,[[["serviceconfig",3]]]],[0,"stats","mcaptcha","",null,null],[0,"fetch","mcaptcha::stats","",null,null],[3,"Stats","mcaptcha::stats::fetch","",null,null],[12,"config_fetches","","",75,null],[12,"solves","","",75,null],[12,"confirms","","",75,null],[11,"new","","",75,[[["pgpool",6],["str",15]]]],[11,"fetch_config_fetched","","featch PoWConfig fetches",75,[[["pgpool",6],["str",15]]]],[11,"fetch_solve","","featch PoWConfig solves",75,[[["pgpool",6],["str",15]]]],[11,"fetch_confirm","","featch PoWConfig confirms",75,[[["pgpool",6],["str",15]]]],[0,"record","mcaptcha::stats","",null,null],[5,"record_fetch","mcaptcha::stats::record","record PoWConfig fetches",null,[[["pgpool",6],["str",15]]]],[5,"record_solve","","record PoWConfig solves",null,[[["pgpool",6],["str",15]]]],[5,"record_confirm","","record PoWConfig confirms",null,[[["pgpool",6],["str",15]]]],[0,"widget","mcaptcha","",null,null],[0,"routes","mcaptcha::widget","",null,null],[3,"Widget","mcaptcha::widget::routes","",null,null],[12,"verification_widget","","",76,null],[12,"js","","",76,null],[12,"wasm","","",76,null],[11,"new","","",76,[[]]],[17,"WIDGET_ROUTES","mcaptcha::widget","",null,null],[3,"IndexPage","","",null,null],[17,"PAGE","","",null,null],[11,"new","","",77,[[]]],[3,"INDEX_PAGE","","",null,null],[12,"__private_field","","",78,null],[3,"show_widget","","render a client side widget for CAPTCHA verification",null,null],[3,"WidgetAssets","","",null,null],[11,"get","","",79,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",79,[[]]],[5,"handle_widget_assets","","",null,[[["str",15]],["httpresponse",3]]],[3,"widget_assets","","",null,null],[5,"services","","",null,[[["serviceconfig",3]]]],[3,"Data","mcaptcha","App data",null,null],[12,"db","","databse pool",40,null],[12,"creds","","credential management configuration",40,null],[12,"captcha","","mCaptcha system: Redis cache, etc.",40,null],[12,"mailer","","email client",40,null],[17,"V1_API_ROUTES","","",null,null],[17,"DOCS","","",null,null],[17,"PAGES","","",null,null],[3,"Settings","","",null,null],[12,"debug","","",71,null],[12,"database","","",71,null],[12,"redis","","",71,null],[12,"server","","",71,null],[12,"pow","","",71,null],[12,"source_code","","",71,null],[12,"smtp","","",71,null],[17,"WIDGET_ROUTES","","",null,null],[3,"CheckLogin","","",null,null],[3,"SETTINGS","","",null,null],[12,"__private_field","","",80,null],[3,"FILES","","",null,null],[12,"__private_field","","",81,null],[3,"JS","","",null,null],[12,"__private_field","","",82,null],[3,"CSS","","",null,null],[12,"__private_field","","",83,null],[3,"MOBILE_CSS","","",null,null],[12,"__private_field","","",84,null],[3,"VERIFICATIN_WIDGET_JS","","",null,null],[12,"__private_field","","",85,null],[3,"VERIFICATIN_WIDGET_CSS","","",null,null],[12,"__private_field","","",86,null],[3,"SOURCE_FILES_OF_INSTANCE","","points to source files matching build commit",null,null],[12,"__private_field","","",87,null],[7,"OPEN_API_DOC","","",null,null],[7,"GIT_COMMIT_HASH","","",null,null],[7,"VERSION","","",null,null],[7,"PKG_NAME","","",null,null],[7,"PKG_DESCRIPTION","","",null,null],[7,"PKG_HOMEPAGE","","",null,null],[17,"CACHE_AGE","","",null,null],[6,"AppData","","",null,null],[5,"main","","",null,[[],["result",6]]],[5,"get_json_err","","",null,[[],["jsonconfig",3]]],[5,"get_identity_service","","",null,[[],[["identityservice",3],["cookieidentitypolicy",3]]]],[14,"define_resource","","Defines resoures for [Methods]",null,null],[11,"from","mcaptcha::api::v1::account::delete","",88,[[]]],[11,"into","","",88,[[]]],[11,"borrow","","",88,[[]]],[11,"borrow_mut","","",88,[[]]],[11,"try_from","","",88,[[],["result",4]]],[11,"try_into","","",88,[[],["result",4]]],[11,"type_id","","",88,[[],["typeid",3]]],[11,"vzip","","",88,[[]]],[11,"from","mcaptcha::api::v1::account::email","",0,[[]]],[11,"into","","",0,[[]]],[11,"to_owned","","",0,[[]]],[11,"clone_into","","",0,[[]]],[11,"borrow","","",0,[[]]],[11,"borrow_mut","","",0,[[]]],[11,"try_from","","",0,[[],["result",4]]],[11,"try_into","","",0,[[],["result",4]]],[11,"type_id","","",0,[[],["typeid",3]]],[11,"vzip","","",0,[[]]],[11,"from","","",89,[[]]],[11,"into","","",89,[[]]],[11,"borrow","","",89,[[]]],[11,"borrow_mut","","",89,[[]]],[11,"try_from","","",89,[[],["result",4]]],[11,"try_into","","",89,[[],["result",4]]],[11,"type_id","","",89,[[],["typeid",3]]],[11,"vzip","","",89,[[]]],[11,"from","","",90,[[]]],[11,"into","","",90,[[]]],[11,"borrow","","",90,[[]]],[11,"borrow_mut","","",90,[[]]],[11,"try_from","","",90,[[],["result",4]]],[11,"try_into","","",90,[[],["result",4]]],[11,"type_id","","",90,[[],["typeid",3]]],[11,"vzip","","",90,[[]]],[11,"from","mcaptcha::api::v1::account::secret","",1,[[]]],[11,"into","","",1,[[]]],[11,"to_owned","","",1,[[]]],[11,"clone_into","","",1,[[]]],[11,"borrow","","",1,[[]]],[11,"borrow_mut","","",1,[[]]],[11,"try_from","","",1,[[],["result",4]]],[11,"try_into","","",1,[[],["result",4]]],[11,"type_id","","",1,[[],["typeid",3]]],[11,"vzip","","",1,[[]]],[11,"from","","",91,[[]]],[11,"into","","",91,[[]]],[11,"borrow","","",91,[[]]],[11,"borrow_mut","","",91,[[]]],[11,"try_from","","",91,[[],["result",4]]],[11,"try_into","","",91,[[],["result",4]]],[11,"type_id","","",91,[[],["typeid",3]]],[11,"vzip","","",91,[[]]],[11,"from","","",92,[[]]],[11,"into","","",92,[[]]],[11,"borrow","","",92,[[]]],[11,"borrow_mut","","",92,[[]]],[11,"try_from","","",92,[[],["result",4]]],[11,"try_into","","",92,[[],["result",4]]],[11,"type_id","","",92,[[],["typeid",3]]],[11,"vzip","","",92,[[]]],[11,"from","mcaptcha::api::v1::account::username","",93,[[]]],[11,"into","","",93,[[]]],[11,"borrow","","",93,[[]]],[11,"borrow_mut","","",93,[[]]],[11,"try_from","","",93,[[],["result",4]]],[11,"try_into","","",93,[[],["result",4]]],[11,"type_id","","",93,[[],["typeid",3]]],[11,"vzip","","",93,[[]]],[11,"from","mcaptcha::api::v1::account::routes","",2,[[]]],[11,"into","","",2,[[]]],[11,"borrow","","",2,[[]]],[11,"borrow_mut","","",2,[[]]],[11,"try_from","","",2,[[],["result",4]]],[11,"try_into","","",2,[[],["result",4]]],[11,"type_id","","",2,[[],["typeid",3]]],[11,"vzip","","",2,[[]]],[11,"from","mcaptcha::api::v1::account","",3,[[]]],[11,"into","","",3,[[]]],[11,"to_owned","","",3,[[]]],[11,"clone_into","","",3,[[]]],[11,"borrow","","",3,[[]]],[11,"borrow_mut","","",3,[[]]],[11,"try_from","","",3,[[],["result",4]]],[11,"try_into","","",3,[[],["result",4]]],[11,"type_id","","",3,[[],["typeid",3]]],[11,"vzip","","",3,[[]]],[11,"from","","",4,[[]]],[11,"into","","",4,[[]]],[11,"to_owned","","",4,[[]]],[11,"clone_into","","",4,[[]]],[11,"borrow","","",4,[[]]],[11,"borrow_mut","","",4,[[]]],[11,"try_from","","",4,[[],["result",4]]],[11,"try_into","","",4,[[],["result",4]]],[11,"type_id","","",4,[[],["typeid",3]]],[11,"vzip","","",4,[[]]],[11,"from","mcaptcha::api::v1::auth::routes","",5,[[]]],[11,"into","","",5,[[]]],[11,"borrow","","",5,[[]]],[11,"borrow_mut","","",5,[[]]],[11,"try_from","","",5,[[],["result",4]]],[11,"try_into","","",5,[[],["result",4]]],[11,"type_id","","",5,[[],["typeid",3]]],[11,"vzip","","",5,[[]]],[11,"from","mcaptcha::api::v1::auth::runners","",6,[[]]],[11,"into","","",6,[[]]],[11,"to_owned","","",6,[[]]],[11,"clone_into","","",6,[[]]],[11,"borrow","","",6,[[]]],[11,"borrow_mut","","",6,[[]]],[11,"try_from","","",6,[[],["result",4]]],[11,"try_into","","",6,[[],["result",4]]],[11,"type_id","","",6,[[],["typeid",3]]],[11,"vzip","","",6,[[]]],[11,"from","","",7,[[]]],[11,"into","","",7,[[]]],[11,"to_owned","","",7,[[]]],[11,"clone_into","","",7,[[]]],[11,"borrow","","",7,[[]]],[11,"borrow_mut","","",7,[[]]],[11,"try_from","","",7,[[],["result",4]]],[11,"try_into","","",7,[[],["result",4]]],[11,"type_id","","",7,[[],["typeid",3]]],[11,"vzip","","",7,[[]]],[11,"from","","",8,[[]]],[11,"into","","",8,[[]]],[11,"to_owned","","",8,[[]]],[11,"clone_into","","",8,[[]]],[11,"borrow","","",8,[[]]],[11,"borrow_mut","","",8,[[]]],[11,"try_from","","",8,[[],["result",4]]],[11,"try_into","","",8,[[],["result",4]]],[11,"type_id","","",8,[[],["typeid",3]]],[11,"vzip","","",8,[[]]],[11,"from","mcaptcha::api::v1::auth","",94,[[]]],[11,"into","","",94,[[]]],[11,"borrow","","",94,[[]]],[11,"borrow_mut","","",94,[[]]],[11,"try_from","","",94,[[],["result",4]]],[11,"try_into","","",94,[[],["result",4]]],[11,"type_id","","",94,[[],["typeid",3]]],[11,"vzip","","",94,[[]]],[11,"from","","",95,[[]]],[11,"into","","",95,[[]]],[11,"borrow","","",95,[[]]],[11,"borrow_mut","","",95,[[]]],[11,"try_from","","",95,[[],["result",4]]],[11,"try_into","","",95,[[],["result",4]]],[11,"type_id","","",95,[[],["typeid",3]]],[11,"vzip","","",95,[[]]],[11,"from","","",96,[[]]],[11,"into","","",96,[[]]],[11,"borrow","","",96,[[]]],[11,"borrow_mut","","",96,[[]]],[11,"try_from","","",96,[[],["result",4]]],[11,"try_into","","",96,[[],["result",4]]],[11,"type_id","","",96,[[],["typeid",3]]],[11,"vzip","","",96,[[]]],[11,"from","mcaptcha::api::v1::mcaptcha::captcha::routes","",9,[[]]],[11,"into","","",9,[[]]],[11,"borrow","","",9,[[]]],[11,"borrow_mut","","",9,[[]]],[11,"try_from","","",9,[[],["result",4]]],[11,"try_into","","",9,[[],["result",4]]],[11,"type_id","","",9,[[],["typeid",3]]],[11,"vzip","","",9,[[]]],[11,"from","mcaptcha::api::v1::mcaptcha::captcha","",10,[[]]],[11,"into","","",10,[[]]],[11,"to_owned","","",10,[[]]],[11,"clone_into","","",10,[[]]],[11,"borrow","","",10,[[]]],[11,"borrow_mut","","",10,[[]]],[11,"try_from","","",10,[[],["result",4]]],[11,"try_into","","",10,[[],["result",4]]],[11,"type_id","","",10,[[],["typeid",3]]],[11,"vzip","","",10,[[]]],[11,"from","","",11,[[]]],[11,"into","","",11,[[]]],[11,"to_owned","","",11,[[]]],[11,"clone_into","","",11,[[]]],[11,"borrow","","",11,[[]]],[11,"borrow_mut","","",11,[[]]],[11,"try_from","","",11,[[],["result",4]]],[11,"try_into","","",11,[[],["result",4]]],[11,"type_id","","",11,[[],["typeid",3]]],[11,"vzip","","",11,[[]]],[11,"from","","",97,[[]]],[11,"into","","",97,[[]]],[11,"borrow","","",97,[[]]],[11,"borrow_mut","","",97,[[]]],[11,"try_from","","",97,[[],["result",4]]],[11,"try_into","","",97,[[],["result",4]]],[11,"type_id","","",97,[[],["typeid",3]]],[11,"vzip","","",97,[[]]],[11,"from","","",98,[[]]],[11,"into","","",98,[[]]],[11,"borrow","","",98,[[]]],[11,"borrow_mut","","",98,[[]]],[11,"try_from","","",98,[[],["result",4]]],[11,"try_into","","",98,[[],["result",4]]],[11,"type_id","","",98,[[],["typeid",3]]],[11,"vzip","","",98,[[]]],[11,"from","","",99,[[]]],[11,"into","","",99,[[]]],[11,"borrow","","",99,[[]]],[11,"borrow_mut","","",99,[[]]],[11,"try_from","","",99,[[],["result",4]]],[11,"try_into","","",99,[[],["result",4]]],[11,"type_id","","",99,[[],["typeid",3]]],[11,"vzip","","",99,[[]]],[11,"from","mcaptcha::api::v1::mcaptcha::duration::routes","",12,[[]]],[11,"into","","",12,[[]]],[11,"borrow","","",12,[[]]],[11,"borrow_mut","","",12,[[]]],[11,"try_from","","",12,[[],["result",4]]],[11,"try_into","","",12,[[],["result",4]]],[11,"type_id","","",12,[[],["typeid",3]]],[11,"vzip","","",12,[[]]],[11,"from","mcaptcha::api::v1::mcaptcha::duration","",13,[[]]],[11,"into","","",13,[[]]],[11,"borrow","","",13,[[]]],[11,"borrow_mut","","",13,[[]]],[11,"try_from","","",13,[[],["result",4]]],[11,"try_into","","",13,[[],["result",4]]],[11,"type_id","","",13,[[],["typeid",3]]],[11,"vzip","","",13,[[]]],[11,"from","","",100,[[]]],[11,"into","","",100,[[]]],[11,"borrow","","",100,[[]]],[11,"borrow_mut","","",100,[[]]],[11,"try_from","","",100,[[],["result",4]]],[11,"try_into","","",100,[[],["result",4]]],[11,"type_id","","",100,[[],["typeid",3]]],[11,"vzip","","",100,[[]]],[11,"from","","",14,[[]]],[11,"into","","",14,[[]]],[11,"borrow","","",14,[[]]],[11,"borrow_mut","","",14,[[]]],[11,"try_from","","",14,[[],["result",4]]],[11,"try_into","","",14,[[],["result",4]]],[11,"type_id","","",14,[[],["typeid",3]]],[11,"vzip","","",14,[[]]],[11,"from","","",15,[[]]],[11,"into","","",15,[[]]],[11,"borrow","","",15,[[]]],[11,"borrow_mut","","",15,[[]]],[11,"try_from","","",15,[[],["result",4]]],[11,"try_into","","",15,[[],["result",4]]],[11,"type_id","","",15,[[],["typeid",3]]],[11,"vzip","","",15,[[]]],[11,"from","","",101,[[]]],[11,"into","","",101,[[]]],[11,"borrow","","",101,[[]]],[11,"borrow_mut","","",101,[[]]],[11,"try_from","","",101,[[],["result",4]]],[11,"try_into","","",101,[[],["result",4]]],[11,"type_id","","",101,[[],["typeid",3]]],[11,"vzip","","",101,[[]]],[11,"from","mcaptcha::api::v1::mcaptcha::levels::routes","",16,[[]]],[11,"into","","",16,[[]]],[11,"borrow","","",16,[[]]],[11,"borrow_mut","","",16,[[]]],[11,"try_from","","",16,[[],["result",4]]],[11,"try_into","","",16,[[],["result",4]]],[11,"type_id","","",16,[[],["typeid",3]]],[11,"vzip","","",16,[[]]],[11,"from","mcaptcha::api::v1::mcaptcha::levels","",17,[[]]],[11,"into","","",17,[[]]],[11,"borrow","","",17,[[]]],[11,"borrow_mut","","",17,[[]]],[11,"try_from","","",17,[[],["result",4]]],[11,"try_into","","",17,[[],["result",4]]],[11,"type_id","","",17,[[],["typeid",3]]],[11,"vzip","","",17,[[]]],[11,"from","","",102,[[]]],[11,"into","","",102,[[]]],[11,"borrow","","",102,[[]]],[11,"borrow_mut","","",102,[[]]],[11,"try_from","","",102,[[],["result",4]]],[11,"try_into","","",102,[[],["result",4]]],[11,"type_id","","",102,[[],["typeid",3]]],[11,"vzip","","",102,[[]]],[11,"from","","",18,[[]]],[11,"into","","",18,[[]]],[11,"borrow","","",18,[[]]],[11,"borrow_mut","","",18,[[]]],[11,"try_from","","",18,[[],["result",4]]],[11,"try_into","","",18,[[],["result",4]]],[11,"type_id","","",18,[[],["typeid",3]]],[11,"vzip","","",18,[[]]],[11,"from","","",103,[[]]],[11,"into","","",103,[[]]],[11,"borrow","","",103,[[]]],[11,"borrow_mut","","",103,[[]]],[11,"try_from","","",103,[[],["result",4]]],[11,"try_into","","",103,[[],["result",4]]],[11,"type_id","","",103,[[],["typeid",3]]],[11,"vzip","","",103,[[]]],[11,"from","","",104,[[]]],[11,"into","","",104,[[]]],[11,"borrow","","",104,[[]]],[11,"borrow_mut","","",104,[[]]],[11,"try_from","","",104,[[],["result",4]]],[11,"try_into","","",104,[[],["result",4]]],[11,"type_id","","",104,[[],["typeid",3]]],[11,"vzip","","",104,[[]]],[11,"from","","",105,[[]]],[11,"into","","",105,[[]]],[11,"borrow","","",105,[[]]],[11,"borrow_mut","","",105,[[]]],[11,"try_from","","",105,[[],["result",4]]],[11,"try_into","","",105,[[],["result",4]]],[11,"type_id","","",105,[[],["typeid",3]]],[11,"vzip","","",105,[[]]],[11,"from","","",19,[[]]],[11,"into","","",19,[[]]],[11,"to_owned","","",19,[[]]],[11,"clone_into","","",19,[[]]],[11,"borrow","","",19,[[]]],[11,"borrow_mut","","",19,[[]]],[11,"try_from","","",19,[[],["result",4]]],[11,"try_into","","",19,[[],["result",4]]],[11,"type_id","","",19,[[],["typeid",3]]],[11,"vzip","","",19,[[]]],[11,"from","","",20,[[]]],[11,"into","","",20,[[]]],[11,"to_owned","","",20,[[]]],[11,"clone_into","","",20,[[]]],[11,"borrow","","",20,[[]]],[11,"borrow_mut","","",20,[[]]],[11,"try_from","","",20,[[],["result",4]]],[11,"try_into","","",20,[[],["result",4]]],[11,"type_id","","",20,[[],["typeid",3]]],[11,"vzip","","",20,[[]]],[11,"from","mcaptcha::api::v1::meta::routes","",21,[[]]],[11,"into","","",21,[[]]],[11,"borrow","","",21,[[]]],[11,"borrow_mut","","",21,[[]]],[11,"try_from","","",21,[[],["result",4]]],[11,"try_into","","",21,[[],["result",4]]],[11,"type_id","","",21,[[],["typeid",3]]],[11,"vzip","","",21,[[]]],[11,"from","mcaptcha::api::v1::meta","",22,[[]]],[11,"into","","",22,[[]]],[11,"to_owned","","",22,[[]]],[11,"clone_into","","",22,[[]]],[11,"borrow","","",22,[[]]],[11,"borrow_mut","","",22,[[]]],[11,"try_from","","",22,[[],["result",4]]],[11,"try_into","","",22,[[],["result",4]]],[11,"type_id","","",22,[[],["typeid",3]]],[11,"vzip","","",22,[[]]],[11,"from","","",23,[[]]],[11,"into","","",23,[[]]],[11,"to_owned","","",23,[[]]],[11,"clone_into","","",23,[[]]],[11,"borrow","","",23,[[]]],[11,"borrow_mut","","",23,[[]]],[11,"try_from","","",23,[[],["result",4]]],[11,"try_into","","",23,[[],["result",4]]],[11,"type_id","","",23,[[],["typeid",3]]],[11,"vzip","","",23,[[]]],[11,"from","","",24,[[]]],[11,"into","","",24,[[]]],[11,"to_string","","",24,[[],["string",3]]],[11,"borrow","","",24,[[]]],[11,"borrow_mut","","",24,[[]]],[11,"try_from","","",24,[[],["result",4]]],[11,"try_into","","",24,[[],["result",4]]],[11,"type_id","","",24,[[],["typeid",3]]],[11,"vzip","","",24,[[]]],[11,"from","","",106,[[]]],[11,"into","","",106,[[]]],[11,"borrow","","",106,[[]]],[11,"borrow_mut","","",106,[[]]],[11,"try_from","","",106,[[],["result",4]]],[11,"try_into","","",106,[[],["result",4]]],[11,"type_id","","",106,[[],["typeid",3]]],[11,"vzip","","",106,[[]]],[11,"from","","",25,[[]]],[11,"into","","",25,[[]]],[11,"to_owned","","",25,[[]]],[11,"clone_into","","",25,[[]]],[11,"borrow","","",25,[[]]],[11,"borrow_mut","","",25,[[]]],[11,"try_from","","",25,[[],["result",4]]],[11,"try_into","","",25,[[],["result",4]]],[11,"type_id","","",25,[[],["typeid",3]]],[11,"vzip","","",25,[[]]],[11,"from","","",26,[[]]],[11,"into","","",26,[[]]],[11,"to_owned","","",26,[[]]],[11,"clone_into","","",26,[[]]],[11,"borrow","","",26,[[]]],[11,"borrow_mut","","",26,[[]]],[11,"try_from","","",26,[[],["result",4]]],[11,"try_into","","",26,[[],["result",4]]],[11,"type_id","","",26,[[],["typeid",3]]],[11,"vzip","","",26,[[]]],[11,"from","","",27,[[]]],[11,"into","","",27,[[]]],[11,"to_string","","",27,[[],["string",3]]],[11,"borrow","","",27,[[]]],[11,"borrow_mut","","",27,[[]]],[11,"try_from","","",27,[[],["result",4]]],[11,"try_into","","",27,[[],["result",4]]],[11,"type_id","","",27,[[],["typeid",3]]],[11,"vzip","","",27,[[]]],[11,"from","","",107,[[]]],[11,"into","","",107,[[]]],[11,"borrow","","",107,[[]]],[11,"borrow_mut","","",107,[[]]],[11,"try_from","","",107,[[],["result",4]]],[11,"try_into","","",107,[[],["result",4]]],[11,"type_id","","",107,[[],["typeid",3]]],[11,"vzip","","",107,[[]]],[11,"from","mcaptcha::api::v1::notifications::add","",28,[[]]],[11,"into","","",28,[[]]],[11,"borrow","","",28,[[]]],[11,"borrow_mut","","",28,[[]]],[11,"try_from","","",28,[[],["result",4]]],[11,"try_into","","",28,[[],["result",4]]],[11,"type_id","","",28,[[],["typeid",3]]],[11,"vzip","","",28,[[]]],[11,"from","","",108,[[]]],[11,"into","","",108,[[]]],[11,"borrow","","",108,[[]]],[11,"borrow_mut","","",108,[[]]],[11,"try_from","","",108,[[],["result",4]]],[11,"try_into","","",108,[[],["result",4]]],[11,"type_id","","",108,[[],["typeid",3]]],[11,"vzip","","",108,[[]]],[11,"from","mcaptcha::api::v1::notifications::get","",29,[[]]],[11,"into","","",29,[[]]],[11,"borrow","","",29,[[]]],[11,"borrow_mut","","",29,[[]]],[11,"try_from","","",29,[[],["result",4]]],[11,"try_into","","",29,[[],["result",4]]],[11,"type_id","","",29,[[],["typeid",3]]],[11,"vzip","","",29,[[]]],[11,"from","","",30,[[]]],[11,"into","","",30,[[]]],[11,"borrow","","",30,[[]]],[11,"borrow_mut","","",30,[[]]],[11,"try_from","","",30,[[],["result",4]]],[11,"try_into","","",30,[[],["result",4]]],[11,"type_id","","",30,[[],["typeid",3]]],[11,"vzip","","",30,[[]]],[11,"from","","",109,[[]]],[11,"into","","",109,[[]]],[11,"borrow","","",109,[[]]],[11,"borrow_mut","","",109,[[]]],[11,"try_from","","",109,[[],["result",4]]],[11,"try_into","","",109,[[],["result",4]]],[11,"type_id","","",109,[[],["typeid",3]]],[11,"vzip","","",109,[[]]],[11,"from","mcaptcha::api::v1::notifications::mark_read","",31,[[]]],[11,"into","","",31,[[]]],[11,"borrow","","",31,[[]]],[11,"borrow_mut","","",31,[[]]],[11,"try_from","","",31,[[],["result",4]]],[11,"try_into","","",31,[[],["result",4]]],[11,"type_id","","",31,[[],["typeid",3]]],[11,"vzip","","",31,[[]]],[11,"from","","",32,[[]]],[11,"into","","",32,[[]]],[11,"borrow","","",32,[[]]],[11,"borrow_mut","","",32,[[]]],[11,"try_from","","",32,[[],["result",4]]],[11,"try_into","","",32,[[],["result",4]]],[11,"type_id","","",32,[[],["typeid",3]]],[11,"vzip","","",32,[[]]],[11,"from","","",110,[[]]],[11,"into","","",110,[[]]],[11,"borrow","","",110,[[]]],[11,"borrow_mut","","",110,[[]]],[11,"try_from","","",110,[[],["result",4]]],[11,"try_into","","",110,[[],["result",4]]],[11,"type_id","","",110,[[],["typeid",3]]],[11,"vzip","","",110,[[]]],[11,"from","mcaptcha::api::v1::notifications::routes","",33,[[]]],[11,"into","","",33,[[]]],[11,"borrow","","",33,[[]]],[11,"borrow_mut","","",33,[[]]],[11,"try_from","","",33,[[],["result",4]]],[11,"try_into","","",33,[[],["result",4]]],[11,"type_id","","",33,[[],["typeid",3]]],[11,"vzip","","",33,[[]]],[11,"from","mcaptcha::api::v1::pow::get_config","",34,[[]]],[11,"into","","",34,[[]]],[11,"to_owned","","",34,[[]]],[11,"clone_into","","",34,[[]]],[11,"borrow","","",34,[[]]],[11,"borrow_mut","","",34,[[]]],[11,"try_from","","",34,[[],["result",4]]],[11,"try_into","","",34,[[],["result",4]]],[11,"type_id","","",34,[[],["typeid",3]]],[11,"vzip","","",34,[[]]],[11,"from","","",111,[[]]],[11,"into","","",111,[[]]],[11,"borrow","","",111,[[]]],[11,"borrow_mut","","",111,[[]]],[11,"try_from","","",111,[[],["result",4]]],[11,"try_into","","",111,[[],["result",4]]],[11,"type_id","","",111,[[],["typeid",3]]],[11,"vzip","","",111,[[]]],[11,"from","mcaptcha::api::v1::pow::verify_pow","",35,[[]]],[11,"into","","",35,[[]]],[11,"to_owned","","",35,[[]]],[11,"clone_into","","",35,[[]]],[11,"borrow","","",35,[[]]],[11,"borrow_mut","","",35,[[]]],[11,"try_from","","",35,[[],["result",4]]],[11,"try_into","","",35,[[],["result",4]]],[11,"type_id","","",35,[[],["typeid",3]]],[11,"vzip","","",35,[[]]],[11,"from","","",112,[[]]],[11,"into","","",112,[[]]],[11,"borrow","","",112,[[]]],[11,"borrow_mut","","",112,[[]]],[11,"try_from","","",112,[[],["result",4]]],[11,"try_into","","",112,[[],["result",4]]],[11,"type_id","","",112,[[],["typeid",3]]],[11,"vzip","","",112,[[]]],[11,"from","mcaptcha::api::v1::pow::verify_token","",36,[[]]],[11,"into","","",36,[[]]],[11,"to_owned","","",36,[[]]],[11,"clone_into","","",36,[[]]],[11,"borrow","","",36,[[]]],[11,"borrow_mut","","",36,[[]]],[11,"try_from","","",36,[[],["result",4]]],[11,"try_into","","",36,[[],["result",4]]],[11,"type_id","","",36,[[],["typeid",3]]],[11,"vzip","","",36,[[]]],[11,"from","","",113,[[]]],[11,"into","","",113,[[]]],[11,"borrow","","",113,[[]]],[11,"borrow_mut","","",113,[[]]],[11,"try_from","","",113,[[],["result",4]]],[11,"try_into","","",113,[[],["result",4]]],[11,"type_id","","",113,[[],["typeid",3]]],[11,"vzip","","",113,[[]]],[11,"from","mcaptcha::api::v1::pow::routes","",37,[[]]],[11,"into","","",37,[[]]],[11,"borrow","","",37,[[]]],[11,"borrow_mut","","",37,[[]]],[11,"try_from","","",37,[[],["result",4]]],[11,"try_into","","",37,[[],["result",4]]],[11,"type_id","","",37,[[],["typeid",3]]],[11,"vzip","","",37,[[]]],[11,"from","mcaptcha::api::v1::routes","",38,[[]]],[11,"into","","",38,[[]]],[11,"borrow","","",38,[[]]],[11,"borrow_mut","","",38,[[]]],[11,"try_from","","",38,[[],["result",4]]],[11,"try_into","","",38,[[],["result",4]]],[11,"type_id","","",38,[[],["typeid",3]]],[11,"vzip","","",38,[[]]],[11,"from","mcaptcha::data","",39,[[]]],[11,"into","","",39,[[]]],[11,"borrow","","",39,[[]]],[11,"borrow_mut","","",39,[[]]],[11,"try_from","","",39,[[],["result",4]]],[11,"try_into","","",39,[[],["result",4]]],[11,"type_id","","",39,[[],["typeid",3]]],[11,"vzip","","",39,[[]]],[11,"from","","",40,[[]]],[11,"into","","",40,[[]]],[11,"borrow","","",40,[[]]],[11,"borrow_mut","","",40,[[]]],[11,"try_from","","",40,[[],["result",4]]],[11,"try_into","","",40,[[],["result",4]]],[11,"type_id","","",40,[[],["typeid",3]]],[11,"vzip","","",40,[[]]],[11,"from","mcaptcha::docs::routes","",41,[[]]],[11,"into","","",41,[[]]],[11,"borrow","","",41,[[]]],[11,"borrow_mut","","",41,[[]]],[11,"try_from","","",41,[[],["result",4]]],[11,"try_into","","",41,[[],["result",4]]],[11,"type_id","","",41,[[],["typeid",3]]],[11,"vzip","","",41,[[]]],[11,"from","mcaptcha::docs","",42,[[]]],[11,"into","","",42,[[]]],[11,"borrow","","",42,[[]]],[11,"borrow_mut","","",42,[[]]],[11,"try_from","","",42,[[],["result",4]]],[11,"try_into","","",42,[[],["result",4]]],[11,"type_id","","",42,[[],["typeid",3]]],[11,"vzip","","",42,[[]]],[11,"from","mcaptcha::errors","",43,[[]]],[11,"into","","",43,[[]]],[11,"to_string","","",43,[[],["string",3]]],[11,"borrow","","",43,[[]]],[11,"borrow_mut","","",43,[[]]],[11,"try_from","","",43,[[],["result",4]]],[11,"try_into","","",43,[[],["result",4]]],[11,"type_id","","",43,[[],["typeid",3]]],[11,"vzip","","",43,[[]]],[11,"from","","",44,[[]]],[11,"into","","",44,[[]]],[11,"borrow","","",44,[[]]],[11,"borrow_mut","","",44,[[]]],[11,"try_from","","",44,[[],["result",4]]],[11,"try_into","","",44,[[],["result",4]]],[11,"type_id","","",44,[[],["typeid",3]]],[11,"vzip","","",44,[[]]],[11,"from","","",45,[[]]],[11,"into","","",45,[[]]],[11,"to_string","","",45,[[],["string",3]]],[11,"borrow","","",45,[[]]],[11,"borrow_mut","","",45,[[]]],[11,"try_from","","",45,[[],["result",4]]],[11,"try_into","","",45,[[],["result",4]]],[11,"type_id","","",45,[[],["typeid",3]]],[11,"vzip","","",45,[[]]],[11,"from","mcaptcha::middleware::auth","",114,[[]]],[11,"into","","",114,[[]]],[11,"borrow","","",114,[[]]],[11,"borrow_mut","","",114,[[]]],[11,"try_from","","",114,[[],["result",4]]],[11,"try_into","","",114,[[],["result",4]]],[11,"type_id","","",114,[[],["typeid",3]]],[11,"vzip","","",114,[[]]],[11,"from","","",46,[[]]],[11,"into","","",46,[[]]],[11,"borrow","","",46,[[]]],[11,"borrow_mut","","",46,[[]]],[11,"try_from","","",46,[[],["result",4]]],[11,"try_into","","",46,[[],["result",4]]],[11,"type_id","","",46,[[],["typeid",3]]],[11,"into_service","","",46,[[]]],[11,"vzip","","",46,[[]]],[11,"from","mcaptcha::pages::auth::login","",115,[[]]],[11,"into","","",115,[[]]],[11,"to_owned","","",115,[[]]],[11,"clone_into","","",115,[[]]],[11,"borrow","","",115,[[]]],[11,"borrow_mut","","",115,[[]]],[11,"try_from","","",115,[[],["result",4]]],[11,"try_into","","",115,[[],["result",4]]],[11,"type_id","","",115,[[],["typeid",3]]],[11,"vzip","","",115,[[]]],[11,"from","","",47,[[]]],[11,"into","","",47,[[]]],[11,"borrow","","",47,[[]]],[11,"borrow_mut","","",47,[[]]],[11,"try_from","","",47,[[],["result",4]]],[11,"try_into","","",47,[[],["result",4]]],[11,"type_id","","",47,[[],["typeid",3]]],[11,"vzip","","",47,[[]]],[11,"from","","",116,[[]]],[11,"into","","",116,[[]]],[11,"borrow","","",116,[[]]],[11,"borrow_mut","","",116,[[]]],[11,"try_from","","",116,[[],["result",4]]],[11,"try_into","","",116,[[],["result",4]]],[11,"type_id","","",116,[[],["typeid",3]]],[11,"vzip","","",116,[[]]],[11,"from","mcaptcha::pages::auth::register","",117,[[]]],[11,"into","","",117,[[]]],[11,"to_owned","","",117,[[]]],[11,"clone_into","","",117,[[]]],[11,"borrow","","",117,[[]]],[11,"borrow_mut","","",117,[[]]],[11,"try_from","","",117,[[],["result",4]]],[11,"try_into","","",117,[[],["result",4]]],[11,"type_id","","",117,[[],["typeid",3]]],[11,"vzip","","",117,[[]]],[11,"from","","",48,[[]]],[11,"into","","",48,[[]]],[11,"borrow","","",48,[[]]],[11,"borrow_mut","","",48,[[]]],[11,"try_from","","",48,[[],["result",4]]],[11,"try_into","","",48,[[],["result",4]]],[11,"type_id","","",48,[[],["typeid",3]]],[11,"vzip","","",48,[[]]],[11,"from","","",118,[[]]],[11,"into","","",118,[[]]],[11,"borrow","","",118,[[]]],[11,"borrow_mut","","",118,[[]]],[11,"try_from","","",118,[[],["result",4]]],[11,"try_into","","",118,[[],["result",4]]],[11,"type_id","","",118,[[],["typeid",3]]],[11,"vzip","","",118,[[]]],[11,"from","mcaptcha::pages::auth::routes","",49,[[]]],[11,"into","","",49,[[]]],[11,"borrow","","",49,[[]]],[11,"borrow_mut","","",49,[[]]],[11,"try_from","","",49,[[],["result",4]]],[11,"try_into","","",49,[[],["result",4]]],[11,"type_id","","",49,[[],["typeid",3]]],[11,"vzip","","",49,[[]]],[11,"from","mcaptcha::pages::errors::routes","",50,[[]]],[11,"into","","",50,[[]]],[11,"borrow","","",50,[[]]],[11,"borrow_mut","","",50,[[]]],[11,"try_from","","",50,[[],["result",4]]],[11,"try_into","","",50,[[],["result",4]]],[11,"type_id","","",50,[[],["typeid",3]]],[11,"vzip","","",50,[[]]],[11,"from","mcaptcha::pages::errors","",51,[[]]],[11,"into","","",51,[[]]],[11,"to_owned","","",51,[[]]],[11,"clone_into","","",51,[[]]],[11,"borrow","","",51,[[]]],[11,"borrow_mut","","",51,[[]]],[11,"try_from","","",51,[[],["result",4]]],[11,"try_into","","",51,[[],["result",4]]],[11,"type_id","","",51,[[],["typeid",3]]],[11,"vzip","","",51,[[]]],[11,"from","","",52,[[]]],[11,"into","","",52,[[]]],[11,"borrow","","",52,[[]]],[11,"borrow_mut","","",52,[[]]],[11,"try_from","","",52,[[],["result",4]]],[11,"try_into","","",52,[[],["result",4]]],[11,"type_id","","",52,[[],["typeid",3]]],[11,"vzip","","",52,[[]]],[11,"from","","",53,[[]]],[11,"into","","",53,[[]]],[11,"borrow","","",53,[[]]],[11,"borrow_mut","","",53,[[]]],[11,"try_from","","",53,[[],["result",4]]],[11,"try_into","","",53,[[],["result",4]]],[11,"type_id","","",53,[[],["typeid",3]]],[11,"vzip","","",53,[[]]],[11,"from","mcaptcha::pages::panel::sitekey::add","",54,[[]]],[11,"into","","",54,[[]]],[11,"borrow","","",54,[[]]],[11,"borrow_mut","","",54,[[]]],[11,"try_from","","",54,[[],["result",4]]],[11,"try_into","","",54,[[],["result",4]]],[11,"type_id","","",54,[[],["typeid",3]]],[11,"vzip","","",54,[[]]],[11,"from","","",55,[[]]],[11,"into","","",55,[[]]],[11,"to_owned","","",55,[[]]],[11,"clone_into","","",55,[[]]],[11,"borrow","","",55,[[]]],[11,"borrow_mut","","",55,[[]]],[11,"try_from","","",55,[[],["result",4]]],[11,"try_into","","",55,[[],["result",4]]],[11,"type_id","","",55,[[],["typeid",3]]],[11,"vzip","","",55,[[]]],[11,"from","","",119,[[]]],[11,"into","","",119,[[]]],[11,"borrow","","",119,[[]]],[11,"borrow_mut","","",119,[[]]],[11,"try_from","","",119,[[],["result",4]]],[11,"try_into","","",119,[[],["result",4]]],[11,"type_id","","",119,[[],["typeid",3]]],[11,"vzip","","",119,[[]]],[11,"from","mcaptcha::pages::panel::sitekey::list","",56,[[]]],[11,"into","","",56,[[]]],[11,"to_owned","","",56,[[]]],[11,"clone_into","","",56,[[]]],[11,"borrow","","",56,[[]]],[11,"borrow_mut","","",56,[[]]],[11,"try_from","","",56,[[],["result",4]]],[11,"try_into","","",56,[[],["result",4]]],[11,"type_id","","",56,[[],["typeid",3]]],[11,"vzip","","",56,[[]]],[11,"from","","",120,[[]]],[11,"into","","",120,[[]]],[11,"borrow","","",120,[[]]],[11,"borrow_mut","","",120,[[]]],[11,"try_from","","",120,[[],["result",4]]],[11,"try_into","","",120,[[],["result",4]]],[11,"type_id","","",120,[[],["typeid",3]]],[11,"vzip","","",120,[[]]],[11,"from","mcaptcha::pages::panel::sitekey::view","",57,[[]]],[11,"into","","",57,[[]]],[11,"to_owned","","",57,[[]]],[11,"clone_into","","",57,[[]]],[11,"borrow","","",57,[[]]],[11,"borrow_mut","","",57,[[]]],[11,"try_from","","",57,[[],["result",4]]],[11,"try_into","","",57,[[],["result",4]]],[11,"type_id","","",57,[[],["typeid",3]]],[11,"vzip","","",57,[[]]],[11,"from","","",58,[[]]],[11,"into","","",58,[[]]],[11,"to_owned","","",58,[[]]],[11,"clone_into","","",58,[[]]],[11,"borrow","","",58,[[]]],[11,"borrow_mut","","",58,[[]]],[11,"try_from","","",58,[[],["result",4]]],[11,"try_into","","",58,[[],["result",4]]],[11,"type_id","","",58,[[],["typeid",3]]],[11,"vzip","","",58,[[]]],[11,"from","","",59,[[]]],[11,"into","","",59,[[]]],[11,"to_owned","","",59,[[]]],[11,"clone_into","","",59,[[]]],[11,"borrow","","",59,[[]]],[11,"borrow_mut","","",59,[[]]],[11,"try_from","","",59,[[],["result",4]]],[11,"try_into","","",59,[[],["result",4]]],[11,"type_id","","",59,[[],["typeid",3]]],[11,"vzip","","",59,[[]]],[11,"from","","",121,[[]]],[11,"into","","",121,[[]]],[11,"borrow","","",121,[[]]],[11,"borrow_mut","","",121,[[]]],[11,"try_from","","",121,[[],["result",4]]],[11,"try_into","","",121,[[],["result",4]]],[11,"type_id","","",121,[[],["typeid",3]]],[11,"vzip","","",121,[[]]],[11,"from","mcaptcha::pages::panel::sitekey::routes","",60,[[]]],[11,"into","","",60,[[]]],[11,"borrow","","",60,[[]]],[11,"borrow_mut","","",60,[[]]],[11,"try_from","","",60,[[],["result",4]]],[11,"try_into","","",60,[[],["result",4]]],[11,"type_id","","",60,[[],["typeid",3]]],[11,"vzip","","",60,[[]]],[11,"from","mcaptcha::pages::panel::routes","",61,[[]]],[11,"into","","",61,[[]]],[11,"borrow","","",61,[[]]],[11,"borrow_mut","","",61,[[]]],[11,"try_from","","",61,[[],["result",4]]],[11,"try_into","","",61,[[],["result",4]]],[11,"type_id","","",61,[[],["typeid",3]]],[11,"vzip","","",61,[[]]],[11,"from","mcaptcha::pages::panel","",62,[[]]],[11,"into","","",62,[[]]],[11,"to_owned","","",62,[[]]],[11,"clone_into","","",62,[[]]],[11,"borrow","","",62,[[]]],[11,"borrow_mut","","",62,[[]]],[11,"try_from","","",62,[[],["result",4]]],[11,"try_into","","",62,[[],["result",4]]],[11,"type_id","","",62,[[],["typeid",3]]],[11,"vzip","","",62,[[]]],[11,"from","","",122,[[]]],[11,"into","","",122,[[]]],[11,"borrow","","",122,[[]]],[11,"borrow_mut","","",122,[[]]],[11,"try_from","","",122,[[],["result",4]]],[11,"try_into","","",122,[[],["result",4]]],[11,"type_id","","",122,[[],["typeid",3]]],[11,"vzip","","",122,[[]]],[11,"from","mcaptcha::pages::routes","",63,[[]]],[11,"into","","",63,[[]]],[11,"borrow","","",63,[[]]],[11,"borrow_mut","","",63,[[]]],[11,"try_from","","",63,[[],["result",4]]],[11,"try_into","","",63,[[],["result",4]]],[11,"type_id","","",63,[[],["typeid",3]]],[11,"vzip","","",63,[[]]],[11,"from","mcaptcha::routes","",64,[[]]],[11,"into","","",64,[[]]],[11,"borrow","","",64,[[]]],[11,"borrow_mut","","",64,[[]]],[11,"try_from","","",64,[[],["result",4]]],[11,"try_into","","",64,[[],["result",4]]],[11,"type_id","","",64,[[],["typeid",3]]],[11,"vzip","","",64,[[]]],[11,"from","mcaptcha::settings","",65,[[]]],[11,"into","","",65,[[]]],[11,"to_owned","","",65,[[]]],[11,"clone_into","","",65,[[]]],[11,"borrow","","",65,[[]]],[11,"borrow_mut","","",65,[[]]],[11,"try_from","","",65,[[],["result",4]]],[11,"try_into","","",65,[[],["result",4]]],[11,"type_id","","",65,[[],["typeid",3]]],[11,"vzip","","",65,[[]]],[11,"from","","",66,[[]]],[11,"into","","",66,[[]]],[11,"to_owned","","",66,[[]]],[11,"clone_into","","",66,[[]]],[11,"borrow","","",66,[[]]],[11,"borrow_mut","","",66,[[]]],[11,"try_from","","",66,[[],["result",4]]],[11,"try_into","","",66,[[],["result",4]]],[11,"type_id","","",66,[[],["typeid",3]]],[11,"vzip","","",66,[[]]],[11,"from","","",67,[[]]],[11,"into","","",67,[[]]],[11,"to_owned","","",67,[[]]],[11,"clone_into","","",67,[[]]],[11,"borrow","","",67,[[]]],[11,"borrow_mut","","",67,[[]]],[11,"try_from","","",67,[[],["result",4]]],[11,"try_into","","",67,[[],["result",4]]],[11,"type_id","","",67,[[],["typeid",3]]],[11,"vzip","","",67,[[]]],[11,"from","","",68,[[]]],[11,"into","","",68,[[]]],[11,"to_owned","","",68,[[]]],[11,"clone_into","","",68,[[]]],[11,"borrow","","",68,[[]]],[11,"borrow_mut","","",68,[[]]],[11,"try_from","","",68,[[],["result",4]]],[11,"try_into","","",68,[[],["result",4]]],[11,"type_id","","",68,[[],["typeid",3]]],[11,"vzip","","",68,[[]]],[11,"from","","",69,[[]]],[11,"into","","",69,[[]]],[11,"to_owned","","",69,[[]]],[11,"clone_into","","",69,[[]]],[11,"borrow","","",69,[[]]],[11,"borrow_mut","","",69,[[]]],[11,"try_from","","",69,[[],["result",4]]],[11,"try_into","","",69,[[],["result",4]]],[11,"type_id","","",69,[[],["typeid",3]]],[11,"vzip","","",69,[[]]],[11,"from","","",70,[[]]],[11,"into","","",70,[[]]],[11,"to_owned","","",70,[[]]],[11,"clone_into","","",70,[[]]],[11,"borrow","","",70,[[]]],[11,"borrow_mut","","",70,[[]]],[11,"try_from","","",70,[[],["result",4]]],[11,"try_into","","",70,[[],["result",4]]],[11,"type_id","","",70,[[],["typeid",3]]],[11,"vzip","","",70,[[]]],[11,"from","","",71,[[]]],[11,"into","","",71,[[]]],[11,"to_owned","","",71,[[]]],[11,"clone_into","","",71,[[]]],[11,"borrow","","",71,[[]]],[11,"borrow_mut","","",71,[[]]],[11,"try_from","","",71,[[],["result",4]]],[11,"try_into","","",71,[[],["result",4]]],[11,"type_id","","",71,[[],["typeid",3]]],[11,"vzip","","",71,[[]]],[11,"from","mcaptcha::static_assets::filemap","",72,[[]]],[11,"into","","",72,[[]]],[11,"borrow","","",72,[[]]],[11,"borrow_mut","","",72,[[]]],[11,"try_from","","",72,[[],["result",4]]],[11,"try_into","","",72,[[],["result",4]]],[11,"type_id","","",72,[[],["typeid",3]]],[11,"vzip","","",72,[[]]],[11,"from","mcaptcha::static_assets::static_files","",73,[[]]],[11,"into","","",73,[[]]],[11,"borrow","","",73,[[]]],[11,"borrow_mut","","",73,[[]]],[11,"try_from","","",73,[[],["result",4]]],[11,"try_into","","",73,[[],["result",4]]],[11,"type_id","","",73,[[],["typeid",3]]],[11,"vzip","","",73,[[]]],[11,"from","","",123,[[]]],[11,"into","","",123,[[]]],[11,"borrow","","",123,[[]]],[11,"borrow_mut","","",123,[[]]],[11,"try_from","","",123,[[],["result",4]]],[11,"try_into","","",123,[[],["result",4]]],[11,"type_id","","",123,[[],["typeid",3]]],[11,"vzip","","",123,[[]]],[11,"from","","",74,[[]]],[11,"into","","",74,[[]]],[11,"borrow","","",74,[[]]],[11,"borrow_mut","","",74,[[]]],[11,"try_from","","",74,[[],["result",4]]],[11,"try_into","","",74,[[],["result",4]]],[11,"type_id","","",74,[[],["typeid",3]]],[11,"vzip","","",74,[[]]],[11,"from","","",124,[[]]],[11,"into","","",124,[[]]],[11,"borrow","","",124,[[]]],[11,"borrow_mut","","",124,[[]]],[11,"try_from","","",124,[[],["result",4]]],[11,"try_into","","",124,[[],["result",4]]],[11,"type_id","","",124,[[],["typeid",3]]],[11,"vzip","","",124,[[]]],[11,"from","mcaptcha::stats::fetch","",75,[[]]],[11,"into","","",75,[[]]],[11,"to_owned","","",75,[[]]],[11,"clone_into","","",75,[[]]],[11,"borrow","","",75,[[]]],[11,"borrow_mut","","",75,[[]]],[11,"try_from","","",75,[[],["result",4]]],[11,"try_into","","",75,[[],["result",4]]],[11,"type_id","","",75,[[],["typeid",3]]],[11,"vzip","","",75,[[]]],[11,"from","mcaptcha::widget::routes","",76,[[]]],[11,"into","","",76,[[]]],[11,"borrow","","",76,[[]]],[11,"borrow_mut","","",76,[[]]],[11,"try_from","","",76,[[],["result",4]]],[11,"try_into","","",76,[[],["result",4]]],[11,"type_id","","",76,[[],["typeid",3]]],[11,"vzip","","",76,[[]]],[11,"from","mcaptcha::widget","",77,[[]]],[11,"into","","",77,[[]]],[11,"to_owned","","",77,[[]]],[11,"clone_into","","",77,[[]]],[11,"borrow","","",77,[[]]],[11,"borrow_mut","","",77,[[]]],[11,"try_from","","",77,[[],["result",4]]],[11,"try_into","","",77,[[],["result",4]]],[11,"type_id","","",77,[[],["typeid",3]]],[11,"vzip","","",77,[[]]],[11,"from","","",78,[[]]],[11,"into","","",78,[[]]],[11,"borrow","","",78,[[]]],[11,"borrow_mut","","",78,[[]]],[11,"try_from","","",78,[[],["result",4]]],[11,"try_into","","",78,[[],["result",4]]],[11,"type_id","","",78,[[],["typeid",3]]],[11,"vzip","","",78,[[]]],[11,"from","","",125,[[]]],[11,"into","","",125,[[]]],[11,"borrow","","",125,[[]]],[11,"borrow_mut","","",125,[[]]],[11,"try_from","","",125,[[],["result",4]]],[11,"try_into","","",125,[[],["result",4]]],[11,"type_id","","",125,[[],["typeid",3]]],[11,"vzip","","",125,[[]]],[11,"from","","",79,[[]]],[11,"into","","",79,[[]]],[11,"borrow","","",79,[[]]],[11,"borrow_mut","","",79,[[]]],[11,"try_from","","",79,[[],["result",4]]],[11,"try_into","","",79,[[],["result",4]]],[11,"type_id","","",79,[[],["typeid",3]]],[11,"vzip","","",79,[[]]],[11,"from","","",126,[[]]],[11,"into","","",126,[[]]],[11,"borrow","","",126,[[]]],[11,"borrow_mut","","",126,[[]]],[11,"try_from","","",126,[[],["result",4]]],[11,"try_into","","",126,[[],["result",4]]],[11,"type_id","","",126,[[],["typeid",3]]],[11,"vzip","","",126,[[]]],[11,"from","mcaptcha","",80,[[]]],[11,"into","","",80,[[]]],[11,"borrow","","",80,[[]]],[11,"borrow_mut","","",80,[[]]],[11,"try_from","","",80,[[],["result",4]]],[11,"try_into","","",80,[[],["result",4]]],[11,"type_id","","",80,[[],["typeid",3]]],[11,"vzip","","",80,[[]]],[11,"from","","",81,[[]]],[11,"into","","",81,[[]]],[11,"borrow","","",81,[[]]],[11,"borrow_mut","","",81,[[]]],[11,"try_from","","",81,[[],["result",4]]],[11,"try_into","","",81,[[],["result",4]]],[11,"type_id","","",81,[[],["typeid",3]]],[11,"vzip","","",81,[[]]],[11,"from","","",82,[[]]],[11,"into","","",82,[[]]],[11,"borrow","","",82,[[]]],[11,"borrow_mut","","",82,[[]]],[11,"try_from","","",82,[[],["result",4]]],[11,"try_into","","",82,[[],["result",4]]],[11,"type_id","","",82,[[],["typeid",3]]],[11,"vzip","","",82,[[]]],[11,"from","","",83,[[]]],[11,"into","","",83,[[]]],[11,"borrow","","",83,[[]]],[11,"borrow_mut","","",83,[[]]],[11,"try_from","","",83,[[],["result",4]]],[11,"try_into","","",83,[[],["result",4]]],[11,"type_id","","",83,[[],["typeid",3]]],[11,"vzip","","",83,[[]]],[11,"from","","",84,[[]]],[11,"into","","",84,[[]]],[11,"borrow","","",84,[[]]],[11,"borrow_mut","","",84,[[]]],[11,"try_from","","",84,[[],["result",4]]],[11,"try_into","","",84,[[],["result",4]]],[11,"type_id","","",84,[[],["typeid",3]]],[11,"vzip","","",84,[[]]],[11,"from","","",85,[[]]],[11,"into","","",85,[[]]],[11,"borrow","","",85,[[]]],[11,"borrow_mut","","",85,[[]]],[11,"try_from","","",85,[[],["result",4]]],[11,"try_into","","",85,[[],["result",4]]],[11,"type_id","","",85,[[],["typeid",3]]],[11,"vzip","","",85,[[]]],[11,"from","","",86,[[]]],[11,"into","","",86,[[]]],[11,"borrow","","",86,[[]]],[11,"borrow_mut","","",86,[[]]],[11,"try_from","","",86,[[],["result",4]]],[11,"try_into","","",86,[[],["result",4]]],[11,"type_id","","",86,[[],["typeid",3]]],[11,"vzip","","",86,[[]]],[11,"from","","",87,[[]]],[11,"into","","",87,[[]]],[11,"borrow","","",87,[[]]],[11,"borrow_mut","","",87,[[]]],[11,"try_from","","",87,[[],["result",4]]],[11,"try_into","","",87,[[],["result",4]]],[11,"type_id","","",87,[[],["typeid",3]]],[11,"vzip","","",87,[[]]],[11,"from","mcaptcha::api::v1::meta","",24,[[["uninitializedfielderror",3]]]],[11,"from","","",24,[[["string",3]]]],[11,"from","","",27,[[["uninitializedfielderror",3]]]],[11,"from","","",27,[[["string",3]]]],[11,"from","mcaptcha::api::v1::notifications::get","",30,[[["notification",3]]]],[11,"from","mcaptcha::errors","",43,[[["credserror",4]],["serviceerror",4]]],[11,"from","","",43,[[["validationerrors",3]],["serviceerror",4]]],[11,"from","","",43,[[["parseerror",4]],["serviceerror",4]]],[11,"from","","",43,[[["captchaerror",4]],["serviceerror",4]]],[11,"from","","",43,[[["error",4]]]],[11,"from","","",45,[[["error",4]]]],[11,"from","","",45,[[["serviceerror",4]]]],[11,"clone","mcaptcha::api::v1::account::email","",0,[[],["email",3]]],[11,"clone","mcaptcha::api::v1::account::secret","",1,[[],["secret",3]]],[11,"clone","mcaptcha::api::v1::account","",3,[[],["accountcheckpayload",3]]],[11,"clone","","",4,[[],["accountcheckresp",3]]],[11,"clone","mcaptcha::api::v1::auth::runners","",6,[[],["register",3]]],[11,"clone","","",7,[[],["login",3]]],[11,"clone","","",8,[[],["password",3]]],[11,"clone","mcaptcha::api::v1::mcaptcha::captcha","",10,[[],["mcaptchaid",3]]],[11,"clone","","",11,[[],["mcaptchadetails",3]]],[11,"clone","mcaptcha::api::v1::mcaptcha::levels","",19,[[],["levels",3]]],[11,"clone","","",20,[[],["i32levels",3]]],[11,"clone","mcaptcha::api::v1::meta","",22,[[],["builddetails",3]]],[11,"clone","","",23,[[],["builddetailsbuilder",3]]],[11,"clone","","",25,[[],["health",3]]],[11,"clone","","",26,[[],["healthbuilder",3]]],[11,"clone","mcaptcha::api::v1::pow::get_config","",34,[[],["getconfigpayload",3]]],[11,"clone","mcaptcha::api::v1::pow::verify_pow","",35,[[],["validationtoken",3]]],[11,"clone","mcaptcha::api::v1::pow::verify_token","",36,[[],["captchavalidateresp",3]]],[11,"clone","mcaptcha::pages::auth::login","",115,[[],["indexpage",3]]],[11,"clone","mcaptcha::pages::auth::register","",117,[[],["indexpage",3]]],[11,"clone","mcaptcha::pages::errors","",51,[[],["errorpage",3]]],[11,"clone","mcaptcha::pages::panel::sitekey::add","",55,[[],["indexpage",3]]],[11,"clone","mcaptcha::pages::panel::sitekey::list","",56,[[],["indexpage",3]]],[11,"clone","mcaptcha::pages::panel::sitekey::view","",57,[[],["mcaptchaconfig",3]]],[11,"clone","","",58,[[],["level",3]]],[11,"clone","","",59,[[],["indexpage",3]]],[11,"clone","mcaptcha::pages::panel","",62,[[],["indexpage",3]]],[11,"clone","mcaptcha::settings","",65,[[],["server",3]]],[11,"clone","","",66,[[],["captcha",3]]],[11,"clone","","",67,[[],["smtp",3]]],[11,"clone","","",68,[[],["databasebuilder",3]]],[11,"clone","","",69,[[],["database",3]]],[11,"clone","","",70,[[],["redis",3]]],[11,"clone","","",71,[[],["settings",3]]],[11,"clone","mcaptcha::stats::fetch","",75,[[],["stats",3]]],[11,"clone","mcaptcha::widget","",77,[[],["indexpage",3]]],[11,"default","mcaptcha::api::v1::meta","",23,[[]]],[11,"default","","",26,[[]]],[11,"default","mcaptcha::pages::auth::login","",115,[[]]],[11,"default","mcaptcha::pages::auth::register","",117,[[]]],[11,"default","mcaptcha::pages::panel::sitekey::add","",55,[[]]],[11,"eq","mcaptcha::errors","",43,[[["serviceerror",4]],["bool",15]]],[11,"ne","","",43,[[["serviceerror",4]],["bool",15]]],[11,"eq","","",45,[[["pageerror",4]],["bool",15]]],[11,"ne","","",45,[[["pageerror",4]],["bool",15]]],[11,"deref","mcaptcha::pages::auth::login","",47,[[],["string",3]]],[11,"deref","mcaptcha::pages::auth::register","",48,[[],["string",3]]],[11,"deref","mcaptcha::pages::errors","",52,[[],["string",3]]],[11,"deref","","",53,[[],["string",3]]],[11,"deref","mcaptcha::pages::panel::sitekey::add","",54,[[],["string",3]]],[11,"deref","mcaptcha::widget","",78,[[],["string",3]]],[11,"deref","mcaptcha","",80,[[],["settings",3]]],[11,"deref","","",81,[[],["filemap",3]]],[11,"deref","","",82,[[],["str",15]]],[11,"deref","","",83,[[],["str",15]]],[11,"deref","","",84,[[],["str",15]]],[11,"deref","","",85,[[],["str",15]]],[11,"deref","","",86,[[],["str",15]]],[11,"deref","","",87,[[],["string",3]]],[11,"fmt","mcaptcha::api::v1::account::email","",0,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::account::secret","",1,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::account","",3,[[["formatter",3]],["result",6]]],[11,"fmt","","",4,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::auth::runners","",6,[[["formatter",3]],["result",6]]],[11,"fmt","","",7,[[["formatter",3]],["result",6]]],[11,"fmt","","",8,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::mcaptcha::captcha","",10,[[["formatter",3]],["result",6]]],[11,"fmt","","",11,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::mcaptcha::levels","",19,[[["formatter",3]],["result",6]]],[11,"fmt","","",20,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::meta","",22,[[["formatter",3]],["result",6]]],[11,"fmt","","",24,[[["formatter",3]],["result",6]]],[11,"fmt","","",25,[[["formatter",3]],["result",6]]],[11,"fmt","","",27,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::pow::get_config","",34,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::pow::verify_pow","",35,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::pow::verify_token","",36,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::errors","",43,[[["formatter",3]],["result",6]]],[11,"fmt","","",45,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::settings","",65,[[["formatter",3]],["result",6]]],[11,"fmt","","",66,[[["formatter",3]],["result",6]]],[11,"fmt","","",67,[[["formatter",3]],["result",6]]],[11,"fmt","","",68,[[["formatter",3]],["result",6]]],[11,"fmt","","",69,[[["formatter",3]],["result",6]]],[11,"fmt","","",70,[[["formatter",3]],["result",6]]],[11,"fmt","","",71,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::stats::fetch","",75,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::api::v1::meta","",24,[[["formatter",3]],["result",6]]],[11,"fmt","","",27,[[["formatter",3]],["result",6]]],[11,"fmt","mcaptcha::errors","",43,[[["formatter",3]],["result",6]]],[11,"fmt","","",45,[[["formatter",3]],["result",6]]],[11,"source","","",43,[[],[["option",4],["error",8]]]],[11,"source","","",45,[[],[["option",4],["error",8]]]],[11,"poll_ready","mcaptcha::middleware::auth","",46,[[["context",3]],[["result",4],["poll",4]]]],[11,"call","","",46,[[["servicerequest",3]]]],[11,"new_transform","","",114,[[]]],[11,"deserialize","mcaptcha::api::v1::account::email","",0,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::account::secret","",1,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::account","",3,[[],["result",4]]],[11,"deserialize","","",4,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::auth::runners","",6,[[],["result",4]]],[11,"deserialize","","",7,[[],["result",4]]],[11,"deserialize","","",8,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::mcaptcha::captcha","",10,[[],["result",4]]],[11,"deserialize","","",11,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::mcaptcha::duration","",13,[[],["result",4]]],[11,"deserialize","","",14,[[],["result",4]]],[11,"deserialize","","",15,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::mcaptcha::levels","",17,[[],["result",4]]],[11,"deserialize","","",18,[[],["result",4]]],[11,"deserialize","","",19,[[],["result",4]]],[11,"deserialize","","",20,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::meta","",22,[[],["result",4]]],[11,"deserialize","","",25,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::notifications::add","",28,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::notifications::get","",30,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::notifications::mark_read","",31,[[],["result",4]]],[11,"deserialize","","",32,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::pow::get_config","",34,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::pow::verify_pow","",35,[[],["result",4]]],[11,"deserialize","mcaptcha::api::v1::pow::verify_token","",36,[[],["result",4]]],[11,"deserialize","mcaptcha::errors","",44,[[],["result",4]]],[11,"deserialize","mcaptcha::settings","",65,[[],["result",4]]],[11,"deserialize","","",66,[[],["result",4]]],[11,"deserialize","","",67,[[],["result",4]]],[11,"deserialize","","",68,[[],["result",4]]],[11,"deserialize","","",69,[[],["result",4]]],[11,"deserialize","","",70,[[],["result",4]]],[11,"deserialize","","",71,[[],["result",4]]],[11,"deserialize","mcaptcha::stats::fetch","",75,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::account::email","",0,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::account::secret","",1,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::account","",3,[[],["result",4]]],[11,"serialize","","",4,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::auth::runners","",6,[[],["result",4]]],[11,"serialize","","",7,[[],["result",4]]],[11,"serialize","","",8,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::mcaptcha::captcha","",10,[[],["result",4]]],[11,"serialize","","",11,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::mcaptcha::duration","",13,[[],["result",4]]],[11,"serialize","","",14,[[],["result",4]]],[11,"serialize","","",15,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::mcaptcha::levels","",17,[[],["result",4]]],[11,"serialize","","",18,[[],["result",4]]],[11,"serialize","","",19,[[],["result",4]]],[11,"serialize","","",20,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::meta","",22,[[],["result",4]]],[11,"serialize","","",25,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::notifications::add","",28,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::notifications::get","",30,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::notifications::mark_read","",31,[[],["result",4]]],[11,"serialize","","",32,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::pow::get_config","",34,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::pow::verify_pow","",35,[[],["result",4]]],[11,"serialize","mcaptcha::api::v1::pow::verify_token","",36,[[],["result",4]]],[11,"serialize","mcaptcha::errors","",44,[[],["result",4]]],[11,"serialize","mcaptcha::stats::fetch","",75,[[],["result",4]]],[11,"register","mcaptcha::api::v1::account::delete","",88,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::account::email","",89,[[["appservice",3]]]],[11,"register","","",90,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::account::secret","",91,[[["appservice",3]]]],[11,"register","","",92,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::account::username","",93,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::auth","",94,[[["appservice",3]]]],[11,"register","","",95,[[["appservice",3]]]],[11,"register","","",96,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::mcaptcha::captcha","",97,[[["appservice",3]]]],[11,"register","","",98,[[["appservice",3]]]],[11,"register","","",99,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::mcaptcha::duration","",100,[[["appservice",3]]]],[11,"register","","",101,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::mcaptcha::levels","",102,[[["appservice",3]]]],[11,"register","","",103,[[["appservice",3]]]],[11,"register","","",104,[[["appservice",3]]]],[11,"register","","",105,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::meta","",106,[[["appservice",3]]]],[11,"register","","",107,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::notifications::add","",108,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::notifications::get","",109,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::notifications::mark_read","",110,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::pow::get_config","",111,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::pow::verify_pow","",112,[[["appservice",3]]]],[11,"register","mcaptcha::api::v1::pow::verify_token","",113,[[["appservice",3]]]],[11,"register","mcaptcha::pages::auth::login","",116,[[["appservice",3]]]],[11,"register","mcaptcha::pages::auth::register","",118,[[["appservice",3]]]],[11,"register","mcaptcha::pages::panel::sitekey::add","",119,[[["appservice",3]]]],[11,"register","mcaptcha::pages::panel::sitekey::list","",120,[[["appservice",3]]]],[11,"register","mcaptcha::pages::panel::sitekey::view","",121,[[["appservice",3]]]],[11,"register","mcaptcha::pages::panel","",122,[[["appservice",3]]]],[11,"register","mcaptcha::static_assets::static_files","",123,[[["appservice",3]]]],[11,"register","","",124,[[["appservice",3]]]],[11,"register","mcaptcha::widget","",125,[[["appservice",3]]]],[11,"register","","",126,[[["appservice",3]]]],[11,"error_response","mcaptcha::errors","",43,[[],["httpresponse",3]]],[11,"status_code","","",43,[[],["statuscode",3]]],[11,"error_response","","",45,[[],["httpresponse",3]]],[11,"status_code","","",45,[[],["statuscode",3]]],[11,"initialize","mcaptcha::pages::auth::login","",47,[[]]],[11,"initialize","mcaptcha::pages::auth::register","",48,[[]]],[11,"initialize","mcaptcha::pages::errors","",52,[[]]],[11,"initialize","","",53,[[]]],[11,"initialize","mcaptcha::pages::panel::sitekey::add","",54,[[]]],[11,"initialize","mcaptcha::widget","",78,[[]]],[11,"initialize","mcaptcha","",80,[[]]],[11,"initialize","","",81,[[]]],[11,"initialize","","",82,[[]]],[11,"initialize","","",83,[[]]],[11,"initialize","","",84,[[]]],[11,"initialize","","",85,[[]]],[11,"initialize","","",86,[[]]],[11,"initialize","","",87,[[]]],[11,"get","mcaptcha::docs","",42,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",42,[[],["filenames",4]]],[11,"get","mcaptcha::static_assets::static_files","",73,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",73,[[],["filenames",4]]],[11,"get","","",74,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",74,[[],["filenames",4]]],[11,"get","mcaptcha::widget","",79,[[["str",15]],[["cow",4],["option",4]]]],[11,"iter","","",79,[[],["filenames",4]]],[11,"render_once","mcaptcha::pages::auth::login","",115,[[],["renderresult",6]]],[11,"render_once_to","","",115,[[["buffer",3]],[["rendererror",4],["result",4]]]],[11,"render_once","mcaptcha::pages::auth::register","",117,[[],["renderresult",6]]],[11,"render_once_to","","",117,[[["buffer",3]],[["rendererror",4],["result",4]]]],[11,"render_once","mcaptcha::pages::errors","",51,[[],["renderresult",6]]],[11,"render_once_to","","",51,[[["buffer",3]],[["rendererror",4],["result",4]]]],[11,"render_once","mcaptcha::pages::panel::sitekey::add","",55,[[],["renderresult",6]]],[11,"render_once_to","","",55,[[["buffer",3]],[["rendererror",4],["result",4]]]],[11,"render_once","mcaptcha::pages::panel::sitekey::list","",56,[[],["renderresult",6]]],[11,"render_once_to","","",56,[[["buffer",3]],[["rendererror",4],["result",4]]]],[11,"render_once","mcaptcha::pages::panel::sitekey::view","",59,[[],["renderresult",6]]],[11,"render_once_to","","",59,[[["buffer",3]],[["rendererror",4],["result",4]]]],[11,"render_once","mcaptcha::pages::panel","",62,[[],["renderresult",6]]],[11,"render_once_to","","",62,[[["buffer",3]],[["rendererror",4],["result",4]]]],[11,"render_once","mcaptcha::widget","",77,[[],["renderresult",6]]],[11,"render_once_to","","",77,[[["buffer",3]],[["rendererror",4],["result",4]]]]],"p":[[3,"Email"],[3,"Secret"],[3,"Account"],[3,"AccountCheckPayload"],[3,"AccountCheckResp"],[3,"Auth"],[3,"Register"],[3,"Login"],[3,"Password"],[3,"MCaptcha"],[3,"MCaptchaID"],[3,"MCaptchaDetails"],[3,"Duration"],[3,"UpdateDuration"],[3,"GetDurationResp"],[3,"GetDuration"],[3,"Levels"],[3,"AddLevels"],[3,"UpdateLevels"],[3,"Levels"],[3,"I32Levels"],[3,"Meta"],[3,"BuildDetails"],[3,"BuildDetailsBuilder"],[4,"BuildDetailsBuilderError"],[3,"Health"],[3,"HealthBuilder"],[4,"HealthBuilderError"],[3,"AddNotification"],[3,"Notification"],[3,"NotificationResp"],[3,"MarkReadReq"],[3,"NotificationResp"],[3,"Notifications"],[3,"GetConfigPayload"],[3,"ValidationToken"],[3,"CaptchaValidateResp"],[3,"PoW"],[3,"Routes"],[4,"SystemGroup"],[3,"Data"],[3,"Docs"],[3,"Asset"],[4,"ServiceError"],[3,"ErrorToResponse"],[4,"PageError"],[3,"CheckLoginMiddleware"],[3,"INDEX"],[3,"INDEX"],[3,"Auth"],[3,"Errors"],[3,"ErrorPage"],[3,"INTERNAL_SERVER_ERROR_BODY"],[3,"UNKNOWN_ERROR_BODY"],[3,"INDEX"],[3,"IndexPage"],[3,"IndexPage"],[3,"McaptchaConfig"],[3,"Level"],[3,"IndexPage"],[3,"Sitekey"],[3,"Panel"],[3,"IndexPage"],[3,"Routes"],[4,"Methods"],[3,"Server"],[3,"Captcha"],[3,"Smtp"],[3,"DatabaseBuilder"],[3,"Database"],[3,"Redis"],[3,"Settings"],[3,"FileMap"],[3,"Asset"],[3,"Favicons"],[3,"Stats"],[3,"Widget"],[3,"IndexPage"],[3,"INDEX_PAGE"],[3,"WidgetAssets"],[3,"SETTINGS"],[3,"FILES"],[3,"JS"],[3,"CSS"],[3,"MOBILE_CSS"],[3,"VERIFICATIN_WIDGET_JS"],[3,"VERIFICATIN_WIDGET_CSS"],[3,"SOURCE_FILES_OF_INSTANCE"],[3,"delete_account"],[3,"email_exists"],[3,"set_email"],[3,"get_secret"],[3,"update_user_secret"],[3,"username_exists"],[3,"register"],[3,"login"],[3,"signout"],[3,"update_token"],[3,"get_token"],[3,"delete_mcaptcha"],[3,"update_duration"],[3,"get_duration"],[3,"add_levels"],[3,"update_levels"],[3,"delete_levels"],[3,"get_levels"],[3,"build_details"],[3,"health"],[3,"add_notification"],[3,"get_notification"],[3,"mark_read"],[3,"get_config"],[3,"verify_pow"],[3,"validate_captcha_token"],[3,"CheckLogin"],[3,"IndexPage"],[3,"login"],[3,"IndexPage"],[3,"join"],[3,"add_sitekey"],[3,"list_sitekeys"],[3,"view_sitekey"],[3,"panel"],[3,"static_files"],[3,"favicons"],[3,"show_widget"],[3,"widget_assets"]]},\ -"tests_migrate":{"doc":"","i":[[0,"data","tests_migrate","App data: redis cache, database connections, etc.",null,null],[4,"SystemGroup","tests_migrate::data","Represents mCaptcha cache and master system. When Redis …",null,null],[13,"Embedded","","",0,null],[13,"Redis","","",0,null],[11,"get_pow","","utility function to get difficulty factor of site id and …",0,[[["string",3]]]],[11,"verify_pow","","utility function to verify [Work]",0,[[["work",3]]]],[11,"validate_verification_tokens","","utility function to validate verification tokens",0,[[["verifycaptcharesult",3]]]],[11,"new_system","","",0,[[["mastertrait",8],["addr",3],["addr",3],["save",8]],[["save",8],["mastertrait",8],["system",3]]]],[11,"new","","",0,[[]]],[3,"Data","","App data",null,null],[12,"db","","databse pool",1,null],[12,"creds","","credential management configuration",1,null],[12,"captcha","","mCaptcha system: Redis cache, etc.",1,null],[12,"mailer","","email client",1,null],[11,"new","","create new instance of app data",1,[[]]],[11,"get_mailer","","",1,[[],[["asyncsmtptransport",3],["option",4]]]],[6,"Mailer","","Mailer data type AsyncSmtpTransport",null,null],[0,"settings","tests_migrate","",null,null],[3,"Server","tests_migrate::settings","",null,null],[12,"allow_registration","","",2,null],[12,"port","","",2,null],[12,"domain","","",2,null],[12,"cookie_secret","","",2,null],[12,"ip","","",2,null],[12,"url_prefix","","",2,null],[3,"Captcha","","",null,null],[12,"salt","","",3,null],[12,"gc","","",3,null],[3,"Smtp","","",null,null],[12,"from","","",4,null],[12,"url","","",4,null],[12,"username","","",4,null],[12,"password","","",4,null],[11,"get_ip","","",2,[[],["string",3]]],[3,"DatabaseBuilder","","",null,null],[12,"port","","",5,null],[12,"hostname","","",5,null],[12,"username","","",5,null],[12,"password","","",5,null],[12,"name","","",5,null],[12,"url","","",5,null],[11,"extract_database_url","","",5,[[["url",3]]]],[3,"Database","","",null,null],[12,"url","","",6,null],[12,"pool","","",6,null],[3,"Redis","","",null,null],[12,"url","","",7,null],[12,"pool","","",7,null],[3,"Settings","","",null,null],[12,"debug","","",8,null],[12,"database","","",8,null],[12,"redis","","",8,null],[12,"server","","",8,null],[12,"pow","","",8,null],[12,"source_code","","",8,null],[12,"smtp","","",8,null],[11,"new","","",8,[[],[["result",4],["configerror",4]]]],[5,"check_url","","",null,[[["config",3]]]],[5,"set_from_database_url","","",null,[[["databasebuilder",3],["config",3]]]],[5,"set_database_url","","",null,[[["config",3]]]],[3,"Data","tests_migrate","App data",null,null],[12,"db","","databse pool",1,null],[12,"creds","","credential management configuration",1,null],[12,"captcha","","mCaptcha system: Redis cache, etc.",1,null],[12,"mailer","","email client",1,null],[3,"Settings","","",null,null],[12,"debug","","",8,null],[12,"database","","",8,null],[12,"redis","","",8,null],[12,"server","","",8,null],[12,"pow","","",8,null],[12,"source_code","","",8,null],[12,"smtp","","",8,null],[3,"SETTINGS","","",null,null],[12,"__private_field","","",9,null],[5,"main","","",null,[[]]],[5,"build","","",null,[[]]],[5,"cache_bust","","",null,[[]]],[11,"from","tests_migrate::data","",0,[[]]],[11,"into","","",0,[[]]],[11,"borrow","","",0,[[]]],[11,"borrow_mut","","",0,[[]]],[11,"try_from","","",0,[[],["result",4]]],[11,"try_into","","",0,[[],["result",4]]],[11,"type_id","","",0,[[],["typeid",3]]],[11,"vzip","","",0,[[]]],[11,"from","","",1,[[]]],[11,"into","","",1,[[]]],[11,"borrow","","",1,[[]]],[11,"borrow_mut","","",1,[[]]],[11,"try_from","","",1,[[],["result",4]]],[11,"try_into","","",1,[[],["result",4]]],[11,"type_id","","",1,[[],["typeid",3]]],[11,"vzip","","",1,[[]]],[11,"from","tests_migrate::settings","",2,[[]]],[11,"into","","",2,[[]]],[11,"to_owned","","",2,[[]]],[11,"clone_into","","",2,[[]]],[11,"borrow","","",2,[[]]],[11,"borrow_mut","","",2,[[]]],[11,"try_from","","",2,[[],["result",4]]],[11,"try_into","","",2,[[],["result",4]]],[11,"type_id","","",2,[[],["typeid",3]]],[11,"vzip","","",2,[[]]],[11,"from","","",3,[[]]],[11,"into","","",3,[[]]],[11,"to_owned","","",3,[[]]],[11,"clone_into","","",3,[[]]],[11,"borrow","","",3,[[]]],[11,"borrow_mut","","",3,[[]]],[11,"try_from","","",3,[[],["result",4]]],[11,"try_into","","",3,[[],["result",4]]],[11,"type_id","","",3,[[],["typeid",3]]],[11,"vzip","","",3,[[]]],[11,"from","","",4,[[]]],[11,"into","","",4,[[]]],[11,"to_owned","","",4,[[]]],[11,"clone_into","","",4,[[]]],[11,"borrow","","",4,[[]]],[11,"borrow_mut","","",4,[[]]],[11,"try_from","","",4,[[],["result",4]]],[11,"try_into","","",4,[[],["result",4]]],[11,"type_id","","",4,[[],["typeid",3]]],[11,"vzip","","",4,[[]]],[11,"from","","",5,[[]]],[11,"into","","",5,[[]]],[11,"to_owned","","",5,[[]]],[11,"clone_into","","",5,[[]]],[11,"borrow","","",5,[[]]],[11,"borrow_mut","","",5,[[]]],[11,"try_from","","",5,[[],["result",4]]],[11,"try_into","","",5,[[],["result",4]]],[11,"type_id","","",5,[[],["typeid",3]]],[11,"vzip","","",5,[[]]],[11,"from","","",6,[[]]],[11,"into","","",6,[[]]],[11,"to_owned","","",6,[[]]],[11,"clone_into","","",6,[[]]],[11,"borrow","","",6,[[]]],[11,"borrow_mut","","",6,[[]]],[11,"try_from","","",6,[[],["result",4]]],[11,"try_into","","",6,[[],["result",4]]],[11,"type_id","","",6,[[],["typeid",3]]],[11,"vzip","","",6,[[]]],[11,"from","","",7,[[]]],[11,"into","","",7,[[]]],[11,"to_owned","","",7,[[]]],[11,"clone_into","","",7,[[]]],[11,"borrow","","",7,[[]]],[11,"borrow_mut","","",7,[[]]],[11,"try_from","","",7,[[],["result",4]]],[11,"try_into","","",7,[[],["result",4]]],[11,"type_id","","",7,[[],["typeid",3]]],[11,"vzip","","",7,[[]]],[11,"from","","",8,[[]]],[11,"into","","",8,[[]]],[11,"to_owned","","",8,[[]]],[11,"clone_into","","",8,[[]]],[11,"borrow","","",8,[[]]],[11,"borrow_mut","","",8,[[]]],[11,"try_from","","",8,[[],["result",4]]],[11,"try_into","","",8,[[],["result",4]]],[11,"type_id","","",8,[[],["typeid",3]]],[11,"vzip","","",8,[[]]],[11,"from","tests_migrate","",9,[[]]],[11,"into","","",9,[[]]],[11,"borrow","","",9,[[]]],[11,"borrow_mut","","",9,[[]]],[11,"try_from","","",9,[[],["result",4]]],[11,"try_into","","",9,[[],["result",4]]],[11,"type_id","","",9,[[],["typeid",3]]],[11,"vzip","","",9,[[]]],[11,"clone","tests_migrate::settings","",2,[[],["server",3]]],[11,"clone","","",3,[[],["captcha",3]]],[11,"clone","","",4,[[],["smtp",3]]],[11,"clone","","",5,[[],["databasebuilder",3]]],[11,"clone","","",6,[[],["database",3]]],[11,"clone","","",7,[[],["redis",3]]],[11,"clone","","",8,[[],["settings",3]]],[11,"deref","tests_migrate","",9,[[],["settings",3]]],[11,"fmt","tests_migrate::settings","",2,[[["formatter",3]],["result",6]]],[11,"fmt","","",3,[[["formatter",3]],["result",6]]],[11,"fmt","","",4,[[["formatter",3]],["result",6]]],[11,"fmt","","",5,[[["formatter",3]],["result",6]]],[11,"fmt","","",6,[[["formatter",3]],["result",6]]],[11,"fmt","","",7,[[["formatter",3]],["result",6]]],[11,"fmt","","",8,[[["formatter",3]],["result",6]]],[11,"initialize","tests_migrate","",9,[[]]],[11,"deserialize","tests_migrate::settings","",2,[[],["result",4]]],[11,"deserialize","","",3,[[],["result",4]]],[11,"deserialize","","",4,[[],["result",4]]],[11,"deserialize","","",5,[[],["result",4]]],[11,"deserialize","","",6,[[],["result",4]]],[11,"deserialize","","",7,[[],["result",4]]],[11,"deserialize","","",8,[[],["result",4]]]],"p":[[4,"SystemGroup"],[3,"Data"],[3,"Server"],[3,"Captcha"],[3,"Smtp"],[3,"DatabaseBuilder"],[3,"Database"],[3,"Redis"],[3,"Settings"],[3,"SETTINGS"]]}\ +"mcaptcha":{"doc":"","t":[6,17,3,3,17,3,3,7,3,3,7,17,7,7,7,3,3,3,17,3,3,7,17,12,12,12,12,12,12,12,12,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,0,12,12,12,14,11,11,11,11,11,11,11,11,0,0,0,11,11,11,11,11,11,11,11,5,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,5,0,0,12,12,0,12,0,12,12,0,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,0,0,0,0,0,0,0,5,3,3,11,11,11,11,11,11,11,11,0,11,11,0,12,11,11,11,11,11,11,0,0,11,11,5,11,11,11,11,11,11,11,11,0,12,11,11,11,11,3,11,11,11,5,11,11,11,11,3,11,11,11,11,11,11,11,11,11,12,3,11,11,11,11,11,11,11,11,11,11,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,12,12,11,12,11,11,11,11,11,12,12,12,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,12,11,5,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,5,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,0,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,12,12,11,12,11,11,11,11,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,11,11,11,11,12,5,12,12,12,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,0,0,5,0,5,3,3,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,12,12,12,11,11,11,0,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,5,11,11,11,11,11,3,11,11,12,11,12,11,11,11,11,11,12,11,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,3,11,11,11,11,11,12,11,11,0,11,11,11,5,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,3,11,11,11,12,11,11,11,11,11,12,11,3,3,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,3,5,11,11,11,11,11,11,11,11,12,12,12,12,11,11,11,11,0,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,11,11,11,11,3,12,11,11,12,11,12,11,11,11,11,11,12,11,3,3,4,3,3,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,3,11,11,11,11,11,11,11,11,11,11,12,12,11,11,0,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,3,11,11,12,11,12,11,11,11,11,11,11,0,0,0,0,5,3,3,11,11,11,11,11,11,11,12,11,11,12,11,11,12,11,11,11,11,11,11,11,11,3,3,11,11,11,11,11,11,11,11,11,11,11,3,12,12,12,12,11,11,11,12,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,11,3,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,12,11,12,11,11,11,11,11,0,0,5,0,0,3,11,11,11,11,11,11,11,11,11,11,3,5,11,11,12,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,12,11,11,12,11,11,11,12,12,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,3,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,3,11,11,17,3,12,12,11,11,12,11,11,12,12,12,11,12,12,11,11,11,11,3,13,6,13,4,11,11,11,11,12,12,12,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,3,17,11,11,5,11,11,11,5,5,11,11,11,0,5,5,11,11,11,11,3,12,11,11,11,12,11,11,12,11,11,11,11,0,3,17,11,11,11,11,11,11,11,11,11,11,11,11,11,5,12,11,12,13,13,13,13,13,3,13,13,13,13,4,6,13,13,13,13,4,13,6,3,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,17,0,0,0,0,5,0,0,0,5,3,3,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,12,12,11,11,11,11,11,3,3,17,3,12,12,11,11,11,11,11,11,11,11,11,11,5,11,11,11,11,11,11,11,11,12,11,11,11,0,5,12,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,12,11,11,11,11,11,12,11,3,17,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,0,5,0,12,11,11,11,11,11,11,11,11,11,3,11,11,11,12,11,11,12,11,11,11,11,0,0,0,5,0,3,3,17,12,3,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,17,6,11,11,11,11,11,11,11,11,5,11,11,3,11,11,11,11,12,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,12,11,11,11,11,12,11,3,3,3,17,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,17,3,12,12,11,11,12,12,11,12,11,11,12,12,12,12,11,11,11,11,13,4,13,13,13,11,11,11,11,11,11,11,11,3,3,3,3,3,3,3,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,12,11,11,11,11,11,11,11,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,5,5,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,11,11,11,11,11,11,11,0,5,0,3,11,11,12,11,11,11,11,11,11,11,11,3,3,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,5,5,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,3,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,5,5,5,3,3,17,17,3,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,11,12,11,11,11,11,12,11,12],"n":["AppData","CACHE_AGE","CSS","CheckLogin","DOCS","Data","FILES","GIT_COMMIT_HASH","JS","MOBILE_CSS","OPEN_API_DOC","PAGES","PKG_DESCRIPTION","PKG_HOMEPAGE","PKG_NAME","SETTINGS","SOURCE_FILES_OF_INSTANCE","Settings","V1_API_ROUTES","VERIFICATIN_WIDGET_CSS","VERIFICATIN_WIDGET_JS","VERSION","WIDGET_ROUTES","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","api","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","captcha","creds","data","database","db","debug","define_resource","deref","deref","deref","deref","deref","deref","deref","deref","docs","email","errors","from","from","from","from","from","from","from","from","get_identity_service","get_json_err","initialize","initialize","initialize","initialize","initialize","initialize","initialize","initialize","into","into","into","into","into","into","into","into","mailer","main","middleware","pages","pow","redis","routes","server","settings","smtp","source_code","static_assets","stats","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","widget","v1","account","auth","mcaptcha","meta","notifications","pow","routes","services","AccountCheckPayload","AccountCheckResp","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","delete","deserialize","deserialize","email","exists","fmt","fmt","from","from","into","into","routes","secret","serialize","serialize","services","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","username","val","vzip","vzip","borrow","borrow_mut","delete_account","from","into","register","services","try_from","try_into","type_id","vzip","Email","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deserialize","email","email_exists","fmt","from","from","from","into","into","into","register","register","serialize","services","set_email","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Account","borrow","borrow_mut","delete","email_exists","from","get_secret","into","new","try_from","try_into","type_id","update_email","update_secret","username_exists","vzip","Secret","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","from","get_secret","into","into","into","register","register","secret","serialize","services","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_user_secret","vzip","vzip","vzip","borrow","borrow_mut","from","into","register","services","try_from","try_into","type_id","username_exists","vzip","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","from","from","from","into","into","into","login","register","register","register","register","routes","runners","services","signout","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Auth","borrow","borrow_mut","from","into","login","logout","new","register","try_from","try_into","type_id","vzip","Login","Password","Register","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","confirm_password","deserialize","deserialize","deserialize","email","fmt","fmt","fmt","from","from","from","into","into","into","login","login_runner","password","password","password","register_runner","serialize","serialize","serialize","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","username","vzip","vzip","vzip","captcha","duration","get_random","levels","services","MCaptchaDetails","MCaptchaID","add_mcaptcha_util","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","delete_mcaptcha","deserialize","deserialize","fmt","fmt","from","from","from","from","from","get_token","into","into","into","into","into","key","name","name","register","register","register","routes","serialize","serialize","services","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","update_token","update_token_helper","vzip","vzip","vzip","vzip","vzip","MCaptcha","borrow","borrow_mut","delete","from","get_token","into","new","try_from","try_into","type_id","update_key","vzip","GetDuration","GetDurationResp","UpdateDuration","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","deserialize","deserialize","deserialize","duration","duration","from","from","from","from","from","get_duration","into","into","into","into","into","key","register","register","routes","serialize","serialize","serialize","services","token","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","update_duration","vzip","vzip","vzip","vzip","vzip","Duration","borrow","borrow_mut","from","get","into","new","try_from","try_into","type_id","update","vzip","AddLevels","I32Levels","Levels","UpdateLevels","add_levels","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","delete_levels","description","deserialize","deserialize","deserialize","deserialize","difficulty_factor","duration","fmt","fmt","from","from","from","from","from","from","from","from","get_levels","get_levels_util","into","into","into","into","into","into","into","into","key","levels","levels","levels","register","register","register","register","routes","serialize","serialize","serialize","serialize","services","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_levels","visitor_threshold","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Levels","add","borrow","borrow_mut","delete","from","get","into","new","try_from","try_into","type_id","update","vzip","BuildDetails","BuildDetailsBuilder","BuildDetailsBuilderError","Health","HealthBuilder","HealthBuilderError","UninitializedField","UninitializedField","ValidationError","ValidationError","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build_details","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","db","db","db","default","default","deserialize","deserialize","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","git_commit_hash","git_commit_hash","git_commit_hash","health","into","into","into","into","into","into","into","into","is_redis","redis","redis","redis","register","register","routes","serialize","serialize","services","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","version","version","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Meta","borrow","borrow_mut","build_details","from","health","into","new","try_from","try_into","type_id","vzip","add","get","mark_read","routes","services","AddNotification","add_notification","borrow","borrow","borrow_mut","borrow_mut","deserialize","from","from","heading","into","into","message","register","serialize","to","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Notification","NotificationResp","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","deserialize","from","from","from","from","get_notification","heading","heading","id","id","into","into","into","message","message","name","name","received","received","register","serialize","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","MarkReadReq","NotificationResp","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","deserialize","deserialize","from","from","from","heading","id","id","into","into","into","mark_read","message","name","received","register","serialize","serialize","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Notifications","add","borrow","borrow_mut","from","get","into","mark_read","new","try_from","try_into","type_id","vzip","get_config","routes","services","verify_pow","verify_token","GetConfigPayload","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","get_config","init_mcaptcha","into","into","key","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","PoW","borrow","borrow_mut","from","get_config","into","new","scope","try_from","try_into","type_id","validate_captcha_token","verify_pow","vzip","ValidationToken","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","into","into","register","serialize","to_owned","token","try_from","try_from","try_into","try_into","type_id","type_id","verify_pow","vzip","vzip","CaptchaValidateResp","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","into","into","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","valid","validate_captcha_token","vzip","vzip","ROUTES","Routes","account","auth","borrow","borrow_mut","duration","from","into","levels","mcaptcha","meta","new","notifications","pow","try_from","try_into","type_id","vzip","Data","Embedded","Mailer","Redis","SystemGroup","borrow","borrow","borrow_mut","borrow_mut","captcha","creds","db","from","from","get_mailer","get_pow","into","into","mailer","new","new","new_system","try_from","try_from","try_into","try_into","type_id","type_id","validate_verification_tokens","verify_pow","vzip","vzip","Asset","DOCS","borrow","borrow_mut","dist","from","get","get","handle_embedded_file","index","into","iter","iter","routes","services","spec","try_from","try_into","type_id","vzip","Docs","assets","borrow","borrow_mut","from","home","into","new","spec","try_from","try_into","type_id","vzip","verification","IndexPage","PAGE","borrow","borrow_mut","clone","clone_into","from","into","new","render_once","render_once_to","to_owned","try_from","try_into","type_id","verification","verification_link","vzip","0","AccountNotFound","BlacklistError","CaptchaError","ClosedForRegistration","EmailTaken","ErrorToResponse","InternalServerError","InternalServerError","NotAUrl","NotAnEmail","PageError","PageResult","PasswordTooLong","PasswordTooShort","PasswordsDontMatch","ProfainityError","ServiceError","ServiceError","ServiceResult","SmtpErrorWrapper","TokenNotFound","UnableToSendEmail","UsernameCaseMappedError","UsernameNotFound","UsernameTaken","WrongPassword","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","deserialize","eq","eq","eq","error","error_response","error_response","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","ne","ne","serialize","source","source","source","status_code","status_code","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","auth","CheckLogin","CheckLoginMiddleware","borrow","borrow","borrow_mut","borrow_mut","call","from","from","into","into","into_service","new_transform","poll_ready","service","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","NAME","auth","errors","panel","routes","services","login","register","routes","services","INDEX","IndexPage","PAGE","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","from","from","from","initialize","into","into","into","login","register","render_once","render_once_to","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","INDEX","IndexPage","PAGE","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","from","from","from","initialize","into","into","into","join","register","render_once","render_once_to","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Auth","borrow","borrow_mut","from","into","join","login","new","try_from","try_into","type_id","vzip","ErrorPage","INTERNAL_SERVER_ERROR_BODY","PAGE","UNKNOWN_ERROR_BODY","__private_field","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deref","deref","error","from","from","from","initialize","initialize","into","into","into","message","new","render_once","render_once_to","routes","services","title","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Errors","borrow","borrow_mut","from","internal_server_error","into","new","try_from","try_into","type_id","unknown_error","vzip","IndexPage","PAGE","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","from","from","into","into","new","panel","register","render_once","render_once_to","routes","services","sitekey","sitekeys","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Panel","borrow","borrow_mut","from","home","into","new","sitekey","try_from","try_into","type_id","vzip","add","list","routes","services","view","INDEX","IndexPage","PAGE","__private_field","add_sitekey","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","form_description","form_duration","form_title","from","from","from","initialize","into","into","into","levels","register","render_once","render_once_to","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","IndexPage","PAGE","SiteKeys","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","from","from","get_list_sitekeys","into","into","list_sitekeys","new","register","render_once","render_once_to","sitekeys","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Sitekey","add","borrow","borrow_mut","from","into","list","new","try_from","try_into","type_id","view","vzip","IndexPage","Level","McaptchaConfig","PAGE","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","config_id","difficulty_factor","duration","duration","from","from","from","from","into","into","into","into","key","levels","name","name","new","register","render_once","render_once_to","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","view_sitekey","visitor_threshold","vzip","vzip","vzip","vzip","ROUTES","Routes","about","auth","borrow","borrow_mut","donate","errors","from","home","into","new","panel","privacy","security","thanks","try_from","try_into","type_id","vzip","Get","Methods","Post","ProtectGet","ProtectPost","borrow","borrow_mut","from","into","try_from","try_into","type_id","vzip","Captcha","Database","DatabaseBuilder","Redis","Server","Settings","Smtp","allow_registration","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_url","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cookie_secret","database","debug","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","domain","extract_database_url","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","gc","get_ip","hostname","into","into","into","into","into","into","into","ip","name","new","password","password","pool","pool","port","port","port","pow","redis","reply_to","salt","server","set_database_url","set_from_database_url","smtp","source_code","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","url","url","url","url","url_prefix","username","username","vzip","vzip","vzip","vzip","vzip","vzip","vzip","filemap","services","static_files","FileMap","borrow","borrow_mut","files","from","get","into","new","try_from","try_into","type_id","vzip","Asset","Favicons","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","favicons","from","from","from","from","get","get","get","get","handle_assets","handle_favicons","into","into","into","into","iter","iter","iter","iter","register","register","static_files","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","fetch","record","Stats","borrow","borrow_mut","clone","clone_into","config_fetches","confirms","deserialize","fetch_config_fetched","fetch_confirm","fetch_solve","fmt","from","into","new","serialize","solves","to_owned","try_from","try_into","type_id","vzip","record_confirm","record_fetch","record_solve","INDEX_PAGE","IndexPage","PAGE","WIDGET_ROUTES","WidgetAssets","__private_field","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deref","from","from","from","from","from","get","get","handle_widget_assets","initialize","into","into","into","into","into","iter","iter","new","register","register","render_once","render_once_to","routes","services","show_widget","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","widget_assets","Widget","borrow","borrow_mut","from","into","js","new","try_from","try_into","type_id","verification_widget","vzip","wasm"],"q":["mcaptcha","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api","mcaptcha::api::v1","","","","","","","","mcaptcha::api::v1::account","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::delete","","","","","","","","","","","mcaptcha::api::v1::account::email","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::routes","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::secret","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::username","","","","","","","","","","","mcaptcha::api::v1::auth","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::auth::routes","","","","","","","","","","","","","mcaptcha::api::v1::auth::runners","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha","","","","","mcaptcha::api::v1::mcaptcha::captcha","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::captcha::routes","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::duration","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::duration::routes","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::levels","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::levels::routes","","","","","","","","","","","","","","mcaptcha::api::v1::meta","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::meta::routes","","","","","","","","","","","","mcaptcha::api::v1::notifications","","","","","mcaptcha::api::v1::notifications::add","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::get","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::mark_read","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::routes","","","","","","","","","","","","","mcaptcha::api::v1::pow","","","","","mcaptcha::api::v1::pow::get_config","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::routes","","","","","","","","","","","","","","mcaptcha::api::v1::pow::verify_pow","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::verify_token","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::routes","","","","","","","","","","","","","","","","","","","mcaptcha::data","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::docs","","","","","","","","","","","","","","","","","","","","mcaptcha::docs::routes","","","","","","","","","","","","","mcaptcha::email","mcaptcha::email::verification","","","","","","","","","","","","","","","","","","mcaptcha::errors","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::middleware","mcaptcha::middleware::auth","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages","","","","","","mcaptcha::pages::auth","","","","mcaptcha::pages::auth::login","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::auth::register","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::auth::routes","","","","","","","","","","","","mcaptcha::pages::errors","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::errors::routes","","","","","","","","","","","","mcaptcha::pages::panel","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::routes","","","","","","","","","","","","mcaptcha::pages::panel::sitekey","","","","","mcaptcha::pages::panel::sitekey::add","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::list","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::routes","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::view","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::routes","","","","","","","","","","","","","","","","","","","","mcaptcha::routes","","","","","","","","","","","","","mcaptcha::settings","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::static_assets","","","mcaptcha::static_assets::filemap","","","","","","","","","","","","mcaptcha::static_assets::static_files","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::stats","","mcaptcha::stats::fetch","","","","","","","","","","","","","","","","","","","","","","mcaptcha::stats::record","","","mcaptcha::widget","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::widget::routes","","","","","","","","","","","",""],"d":["","","","","","App data","","","","","","","","","","","points to source files matching build commit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mCaptcha system: Redis cache, etc.","credential management configuration","App data: redis cache, database connections, etc.","","databse pool","","Defines resoures for [Methods]","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","email client","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","update email","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","returns Ok(()) when everything checks out and the user is …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","name is config_name","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Builder for BuildDetails.","Error type for BuildDetailsBuilder","Health check return datatype","Builder for Health.","Error type for HealthBuilder","Uninitialized field","Uninitialized field","Custom validation error","Custom validation error","","","","","","","","","","","","","","","","","Builds a new BuildDetails.","Builds a new Health.","emmits build details of the bninary","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","checks all components of the system","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","route handler that adds a notification message","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","route handler that gets all unread notifications","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","route handler that marks a notification read","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","PoW Verification module","PoW success token module","","","","","","","","","","","","get PoW configuration for an mcaptcha key","Call this when [MCaptcha][libmcaptcha::MCaptcha] is not …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","validation token that clients receive as proof for …","","","","","","","","","","","","","","","","","","","","","","","route handler that verifies PoW and issues a solution …","","","","","","","","","","","","","","","","","","","","","","","","","","route hander that validates a PoW solution token","","","","","","","","","","","","","","","","","","","","","","App data","","Mailer data type AsyncSmtpTransport","","Represents mCaptcha cache and master system. When Redis …","","","","","mCaptcha system: Redis cache, etc.","credential management configuration","databse pool","","","","utility function to get difficulty factor of site id and …","","","email client","","create new instance of app data","","","","","","","","utility function to validate verification tokens","utility function to verify [Work]","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Email operations: verification, notification, etc","","","","","","","","","","","","","","","","","","","","","when the value passed contains blacklisted words see …","","","email is already taken","","","","","","","","","","","when the value passed contains profainity","","","","","when the a token name is already taken token not found","Unable to send email","when the value passed contains characters not present in …","","when the a username is already taken","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","utility function to get a list of all sitekeys that a …","","","render a list of all sitekeys that a user has","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","route handler that renders individual views for sitekeys","","","","","","","","","","","","","","","","","","","","","","","","","","GET hander","","POST handler","Protected GET handler","Protected POST handler","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","","","","","","","","","","","","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","render a client side widget for CAPTCHA verification","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,9,9,0,10,9,10,0,1,2,3,4,5,6,7,8,0,0,0,1,2,3,4,5,6,7,8,0,0,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,9,0,0,0,10,10,0,10,0,10,10,0,0,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,0,0,0,0,0,0,0,0,0,0,0,0,11,12,11,12,11,12,11,12,0,11,12,0,12,11,12,11,12,11,12,0,0,11,12,0,11,12,11,12,11,12,11,12,0,11,11,12,13,13,0,13,13,13,0,13,13,13,13,0,14,15,16,14,15,16,14,14,14,14,0,14,14,15,16,14,15,16,15,16,14,0,0,14,14,15,16,14,15,16,14,15,16,14,15,16,0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,0,18,19,20,18,19,20,18,18,18,18,18,19,20,0,18,19,20,19,20,18,18,0,18,18,19,20,18,19,20,18,19,20,0,18,19,20,21,21,21,21,21,0,21,21,21,0,21,22,23,24,22,23,24,22,23,24,22,23,24,0,0,22,23,24,0,0,0,0,22,23,24,22,23,24,22,23,24,22,23,24,0,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,26,27,28,26,27,28,26,27,28,26,27,28,26,26,27,28,26,26,27,28,26,27,28,26,27,28,27,0,26,27,28,0,26,27,28,26,27,28,26,27,28,26,27,28,26,27,28,26,26,27,28,0,0,0,0,0,0,0,0,29,30,31,32,33,29,30,31,32,33,29,30,29,30,0,29,30,29,30,29,30,31,32,33,0,29,30,31,32,33,30,29,30,31,32,33,0,29,30,0,29,30,29,30,31,32,33,29,30,31,32,33,29,30,31,32,33,0,0,29,30,31,32,33,0,34,34,34,34,34,34,34,34,34,34,34,34,0,0,0,35,36,37,38,39,35,36,37,38,39,35,37,38,35,37,35,36,37,38,39,0,35,36,37,38,39,35,36,39,0,35,37,38,0,38,35,36,37,38,39,35,36,37,38,39,35,36,37,38,39,0,35,36,37,38,39,0,40,40,40,40,40,40,40,40,40,40,40,0,0,0,0,0,41,42,43,44,45,46,47,48,41,42,43,44,45,46,47,48,47,48,47,48,0,41,41,43,47,48,48,41,47,48,41,42,43,44,45,46,47,48,0,0,41,42,43,44,45,46,47,48,43,41,43,47,42,44,45,46,0,41,43,47,48,0,47,48,41,42,43,44,45,46,47,48,41,42,43,44,45,46,47,48,41,42,43,44,45,46,47,48,0,48,41,42,43,44,45,46,47,48,0,49,49,49,49,49,49,49,49,49,49,49,49,49,0,0,0,0,0,0,50,51,50,51,52,53,50,54,55,56,51,57,52,53,50,54,55,56,51,57,53,56,0,52,53,55,56,52,53,55,56,56,55,56,53,56,52,55,52,50,50,55,51,51,52,53,50,50,50,54,55,56,51,51,51,57,53,52,53,0,52,53,50,54,55,56,51,57,55,56,55,56,54,57,0,52,55,0,52,53,55,56,50,51,52,53,50,54,55,56,51,57,52,53,50,54,55,56,51,57,52,53,50,54,55,56,51,57,53,52,53,52,53,50,54,55,56,51,57,0,58,58,58,58,58,58,58,58,58,58,58,0,0,0,0,0,0,0,59,60,59,60,59,59,60,59,59,60,59,60,59,59,59,60,59,60,59,60,59,60,0,0,61,62,63,61,62,63,62,61,62,62,63,0,61,62,61,62,61,62,63,61,62,61,62,61,62,63,62,61,62,63,61,62,63,61,62,63,61,62,63,0,0,64,65,66,64,65,66,64,65,64,65,66,65,64,65,64,65,66,0,65,65,65,66,64,65,64,65,66,64,65,66,64,65,66,64,65,66,0,67,67,67,67,67,67,67,67,67,67,67,67,0,0,0,0,0,0,68,69,68,69,68,68,68,68,68,69,0,0,68,69,68,69,68,68,68,69,68,69,68,69,68,69,0,70,70,70,70,70,70,70,70,70,70,70,70,70,0,71,72,71,72,71,71,71,71,71,72,71,72,72,71,71,71,71,72,71,72,71,72,0,71,72,0,73,74,73,74,73,73,73,73,73,74,73,74,74,73,73,73,74,73,74,73,74,73,0,73,74,0,0,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,0,76,0,76,0,76,9,76,9,9,9,9,76,9,9,76,76,9,9,76,9,76,76,9,76,9,76,9,76,76,76,9,0,0,77,77,0,77,77,77,0,0,77,77,77,0,0,0,77,77,77,77,0,78,78,78,78,78,78,78,78,78,78,78,78,0,0,0,79,79,79,79,79,79,79,79,79,79,79,79,79,0,79,79,80,81,81,81,81,81,0,81,82,81,81,0,0,81,81,81,81,0,82,0,0,81,81,81,81,81,81,80,81,83,82,80,81,83,82,83,80,81,82,83,81,82,80,80,81,81,82,82,80,81,81,81,81,81,81,81,83,82,82,82,80,81,83,82,81,82,83,80,81,82,81,82,80,81,82,80,81,83,82,80,81,83,82,80,81,83,82,80,81,83,82,0,0,0,84,85,84,85,85,84,85,84,85,85,84,85,85,84,85,84,85,84,85,84,85,0,0,0,0,0,0,0,0,0,0,0,0,0,86,87,86,88,87,86,88,87,87,87,86,87,86,88,86,87,86,88,0,88,87,87,87,87,86,88,87,86,88,87,86,88,87,86,88,0,0,0,89,90,89,91,90,89,91,90,90,90,89,90,89,91,89,90,89,91,0,91,90,90,90,90,89,91,90,89,91,90,89,91,90,89,91,0,92,92,92,92,92,92,92,92,92,92,92,0,0,0,0,93,94,95,93,94,95,93,94,95,95,93,94,0,95,93,94,93,94,95,93,94,95,95,95,95,0,0,95,95,95,93,94,95,93,94,95,93,94,95,93,94,0,96,96,96,96,96,96,96,96,96,96,96,0,0,97,98,97,98,97,97,97,98,97,98,97,0,98,97,97,0,0,0,97,97,97,98,97,98,97,98,97,98,0,99,99,99,99,99,99,99,99,99,99,99,0,0,0,0,0,0,0,0,100,0,100,101,102,100,101,102,101,101,101,100,101,101,101,100,101,102,100,100,101,102,101,102,101,101,101,100,101,102,100,101,102,100,101,102,100,101,102,0,0,0,103,104,103,104,103,103,103,104,0,103,104,0,103,104,103,103,103,103,103,104,103,104,103,104,103,104,0,105,105,105,105,105,105,105,105,105,105,105,105,0,0,0,0,106,107,108,109,106,107,108,109,106,107,108,106,107,108,106,107,106,108,106,107,108,109,106,107,108,109,108,108,106,108,108,109,108,108,106,107,108,106,107,108,109,106,107,108,109,106,107,108,109,0,107,106,107,108,109,0,0,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,0,111,111,111,111,111,111,111,111,111,111,111,0,0,0,0,0,0,0,112,112,113,114,115,116,117,10,112,113,114,115,116,117,10,0,112,113,114,115,116,117,10,112,113,114,115,116,117,10,112,10,10,112,113,114,115,116,117,10,112,115,112,113,114,115,116,117,10,112,113,114,115,116,117,10,114,113,112,115,112,113,114,115,116,117,10,112,115,10,114,115,116,117,112,114,115,10,10,114,113,10,0,0,10,10,112,113,114,115,116,117,10,112,113,114,115,116,117,10,112,113,114,115,116,117,10,112,113,114,115,116,117,10,114,115,116,117,112,114,115,112,113,114,115,116,117,10,0,0,0,0,118,118,118,118,118,118,118,118,118,118,118,0,0,119,120,121,122,119,120,121,122,0,119,120,121,122,119,119,121,121,0,0,119,120,121,122,119,119,121,121,120,122,0,119,120,121,122,119,120,121,122,119,120,121,122,119,120,121,122,0,0,0,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,0,0,0,0,0,0,0,0,124,125,124,126,127,128,125,124,126,127,128,125,125,124,125,124,126,127,128,127,127,0,124,125,124,126,127,128,127,127,125,126,128,125,125,0,0,0,125,125,124,126,127,128,125,124,126,127,128,125,124,126,127,128,125,124,126,127,128,0,0,129,129,129,129,129,129,129,129,129,129,129,129],"f":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,[[],["settings",3]],[[],["filemap",3]],[[],["str",15]],[[],["str",15]],[[],["str",15]],[[],["str",15]],[[],["str",15]],[[],["string",3]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[["cookieidentitypolicy",3],["identityservice",3]]],[[],["jsonconfig",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[],["result",6]],null,null,null,null,null,null,null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,[[["serviceconfig",3]]],null,null,[[]],[[]],[[]],[[]],[[],["accountcheckpayload",3]],[[],["accountcheckresp",3]],[[]],[[]],null,[[],["result",4]],[[],["result",4]],null,null,[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],null,null,[[],["result",4]],[[],["result",4]],[[["serviceconfig",3]]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],null,null,[[]],[[]],[[]],[[]],null,[[]],[[]],[[["appservice",3]]],[[["serviceconfig",3]]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["email",3]],[[]],[[],["result",4]],null,null,[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[],["result",4]],[[["serviceconfig",3]]],null,[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,[[]],[[]],null,null,[[]],null,[[]],[[],["account",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,null,null,[[]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["secret",3]],[[]],[[],["result",4]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],null,[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[["serviceconfig",3]]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["serviceconfig",3]]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],null,null,[[["serviceconfig",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,[[]],[[]],[[]],[[]],null,null,[[],["auth",3]],null,[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["register",3]],[[],["login",3]],[[],["password",3]],[[]],[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["login",3],["appdata",6]]],null,null,null,[[["appdata",6],["register",3]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,[[]],[[]],[[]],null,null,[[["usize",15]],["string",3]],null,[[["serviceconfig",3]]],null,null,[[["appdata",6],["str",15],["u32",15],["identity",3]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["mcaptchaid",3]],[[],["mcaptchadetails",3]],[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],null,[[]],[[]],[[]],[[]],[[]],null,null,null,[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[],["result",4]],[[["serviceconfig",3]]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,[[["appdata",6],["str",15]]],[[]],[[]],[[]],[[]],[[]],null,[[]],[[]],null,[[]],null,[[]],[[],["mcaptcha",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,[[]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,null,[[]],[[]],[[]],[[]],[[]],null,[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["serviceconfig",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,[[]],[[]],[[]],[[]],[[]],null,[[]],[[]],[[]],null,[[]],[[],["duration",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,[[]],null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["levels",3]],[[],["i32levels",3]],[[]],[[]],null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,null,[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appdata",6],["str",15]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["serviceconfig",3]]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[]],[[]],null,[[]],null,[[]],[[],["levels",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,[[]],null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],[["builddetailsbuildererror",4],["result",4],["builddetails",3]]],[[],[["result",4],["health",3],["healthbuildererror",4]]],null,[[],["builddetails",3]],[[],["builddetailsbuilder",3]],[[],["health",3]],[[],["healthbuilder",3]],[[]],[[]],[[]],[[]],[[["bool",15]]],null,null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[["string",3]]],[[["uninitializedfielderror",3]]],[[]],[[]],[[]],[[]],[[["string",3]]],[[["uninitializedfielderror",3]]],[[]],[[["str",15]]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["option",4]],["bool",15]],[[["option",4],["bool",15]]],null,null,[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[],["result",4]],[[["serviceconfig",3]]],[[]],[[]],[[]],[[]],[[],["string",3]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[["str",15]]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[]],[[]],null,[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,[[["serviceconfig",3]]],null,null,[[]],[[]],[[]],[[]],[[],["result",4]],[[]],[[]],null,[[]],[[]],null,[[["appservice",3]]],[[],["result",4]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[]],[[["notification",3]]],[[]],[[]],null,null,null,null,null,[[]],[[]],[[]],null,null,null,null,null,null,[[["appservice",3]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[]],[[]],[[]],null,null,null,[[]],[[]],[[]],null,null,null,null,[[["appservice",3]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,null,[[]],[[]],[[]],null,[[]],null,[[],["notifications",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,[[["serviceconfig",3]]],null,null,null,[[]],[[]],[[]],[[]],[[],["getconfigpayload",3]],[[]],[[],["result",4]],[[["formatter",3]],["result",6]],[[]],[[]],null,[[["appdata",6],["str",15]]],[[]],[[]],null,[[["appservice",3]]],[[],["result",4]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,[[]],[[]],[[]],null,[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,null,[[]],null,[[]],[[]],[[]],[[]],[[],["validationtoken",3]],[[]],[[],["result",4]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[],["result",4]],[[]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],null,[[]],[[]],null,[[]],[[]],[[]],[[]],[[],["captchavalidateresp",3]],[[]],[[],["result",4]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[],["result",4]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],null,null,[[]],[[]],null,null,null,null,[[]],[[]],null,[[]],[[]],null,null,null,[[],["routes",3]],null,null,[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,[[]],[[]],[[]],[[]],null,null,null,[[]],[[]],[[],[["option",4],["asyncsmtptransport",3]]],[[["string",3]]],[[]],[[]],null,[[]],[[]],[[["mastertrait",8],["save",8],["addr",3],["addr",3]],[["save",8],["mastertrait",8],["system",3]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[["verifycaptcharesult",3]]],[[["work",3]]],[[]],[[]],null,null,[[]],[[]],[[["string",3],["path",3]]],[[]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],["httpresponse",3]],[[]],[[]],[[],["filenames",4]],[[]],null,[[["serviceconfig",3]]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,[[]],[[]],[[]],null,[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,[[]],[[]],[[],["indexpage",3]],[[]],[[]],[[]],[[["str",15]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[["data",3],["str",15]]],null,[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["bool",15]],[[["serviceerror",4]],["bool",15]],[[["pageerror",4]],["bool",15]],null,[[],["httpresponse",3]],[[],["httpresponse",3]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[["credserror",4]],["serviceerror",4]],[[["smtperror",3]]],[[["error",4]]],[[["captchaerror",4]],["serviceerror",4]],[[]],[[["parseerror",4]],["serviceerror",4]],[[["validationerrors",3]],["serviceerror",4]],[[]],[[["serviceerror",4]]],[[["error",4]]],[[]],[[]],[[]],[[]],[[]],[[["serviceerror",4]],["bool",15]],[[["pageerror",4]],["bool",15]],[[],["result",4]],[[],[["error",8],["option",4]]],[[],[["error",8],["option",4]]],[[],[["error",8],["option",4]]],[[],["statuscode",3]],[[],["statuscode",3]],[[],["string",3]],[[],["string",3]],[[],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],null,null,null,[[]],[[]],[[]],[[]],[[["servicerequest",3]]],[[]],[[]],[[]],[[]],[[]],[[]],[[["context",3]],[["result",4],["poll",4]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,null,null,null,null,[[["serviceconfig",3]]],null,null,null,[[["serviceconfig",3]]],null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["indexpage",3]],[[]],[[]],[[],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["indexpage",3]],[[]],[[]],[[],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,[[]],[[]],[[]],[[]],null,null,[[],["auth",3]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["errorpage",3]],[[]],[[],["string",3]],[[],["string",3]],[[["usize",15],["path",3]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["str",15]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],null,[[["serviceconfig",3]]],null,[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,[[]],[[]],[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,[[]],null,null,[[]],[[]],[[]],[[]],[[],["indexpage",3]],[[]],[[]],[[]],[[]],[[]],[[["mcaptchadetails",3],["vec",3]]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],null,[[["serviceconfig",3]]],null,null,[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,[[]],[[]],[[]],null,[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,[[["serviceconfig",3]]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[],["indexpage",3]],[[]],[[]],[[],["string",3]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],null,null,null,[[]],[[]],[[]],[[]],[[],["indexpage",3]],[[]],[[]],[[]],[[["appdata",6],["identity",3]]],[[]],[[]],null,[[["mcaptchadetails",3],["vec",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],null,[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],null,null,[[]],[[]],[[]],[[]],null,[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,[[]],null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["mcaptchaconfig",3]],[[],["level",3]],[[],["indexpage",3]],[[]],[[]],[[]],null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,[[["vec",3],["string",3],["mcaptchaconfig",3],["level",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,null,[[]],[[]],[[]],[[]],null,null,null,null,[[]],[[]],null,null,[[]],null,[[]],[[],["routes",3]],null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["config",3]]],[[],["server",3]],[[],["captcha",3]],[[],["smtp",3]],[[],["databasebuilder",3]],[[],["database",3]],[[],["redis",3]],[[],["settings",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[["url",3]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[],[["configerror",4],["result",4]]],null,null,null,null,null,null,null,null,null,null,null,null,[[["config",3]]],[[["databasebuilder",3],["config",3]]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["serviceconfig",3]]],null,null,[[]],[[]],null,[[]],[[["str",15]],[["option",4],["str",15]]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[]],[[]],[[]],[[]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],["httpresponse",3]],[[["str",15]],["httpresponse",3]],[[]],[[]],[[]],[[]],[[]],[[],["filenames",4]],[[],["filenames",4]],[[]],[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],null,null,null,[[]],[[]],[[],["stats",3]],[[]],null,null,[[],["result",4]],[[["pgpool",6],["str",15]]],[[["pgpool",6],["str",15]]],[[["pgpool",6],["str",15]]],[[["formatter",3]],["result",6]],[[]],[[]],[[["pgpool",6],["str",15]]],[[],["result",4]],null,[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],[[["pgpool",6],["str",15]]],[[["pgpool",6],["str",15]]],[[["pgpool",6],["str",15]]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["indexpage",3]],[[]],[[],["string",3]],[[]],[[]],[[]],[[]],[[]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],[["option",4],["cow",4]]],[[["str",15]],["httpresponse",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["filenames",4]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],[["rendererror",4],["result",4]]],null,[[["serviceconfig",3]]],null,[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[]],[[]],[[]],[[]],[[]],null,null,[[]],[[]],[[]],[[]],null,[[]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],null,[[]],null],"p":[[3,"SETTINGS"],[3,"FILES"],[3,"JS"],[3,"CSS"],[3,"MOBILE_CSS"],[3,"VERIFICATIN_WIDGET_JS"],[3,"VERIFICATIN_WIDGET_CSS"],[3,"SOURCE_FILES_OF_INSTANCE"],[3,"Data"],[3,"Settings"],[3,"AccountCheckPayload"],[3,"AccountCheckResp"],[3,"delete_account"],[3,"Email"],[3,"email_exists"],[3,"set_email"],[3,"Account"],[3,"Secret"],[3,"get_secret"],[3,"update_user_secret"],[3,"username_exists"],[3,"register"],[3,"login"],[3,"signout"],[3,"Auth"],[3,"Register"],[3,"Login"],[3,"Password"],[3,"MCaptchaID"],[3,"MCaptchaDetails"],[3,"update_token"],[3,"get_token"],[3,"delete_mcaptcha"],[3,"MCaptcha"],[3,"UpdateDuration"],[3,"update_duration"],[3,"GetDurationResp"],[3,"GetDuration"],[3,"get_duration"],[3,"Duration"],[3,"AddLevels"],[3,"add_levels"],[3,"UpdateLevels"],[3,"update_levels"],[3,"delete_levels"],[3,"get_levels"],[3,"Levels"],[3,"I32Levels"],[3,"Levels"],[4,"BuildDetailsBuilderError"],[4,"HealthBuilderError"],[3,"BuildDetails"],[3,"BuildDetailsBuilder"],[3,"build_details"],[3,"Health"],[3,"HealthBuilder"],[3,"health"],[3,"Meta"],[3,"AddNotification"],[3,"add_notification"],[3,"Notification"],[3,"NotificationResp"],[3,"get_notification"],[3,"MarkReadReq"],[3,"NotificationResp"],[3,"mark_read"],[3,"Notifications"],[3,"GetConfigPayload"],[3,"get_config"],[3,"PoW"],[3,"ValidationToken"],[3,"verify_pow"],[3,"CaptchaValidateResp"],[3,"validate_captcha_token"],[3,"Routes"],[4,"SystemGroup"],[3,"Asset"],[3,"Docs"],[3,"IndexPage"],[3,"SmtpErrorWrapper"],[4,"ServiceError"],[4,"PageError"],[3,"ErrorToResponse"],[3,"CheckLogin"],[3,"CheckLoginMiddleware"],[3,"INDEX"],[3,"IndexPage"],[3,"login"],[3,"INDEX"],[3,"IndexPage"],[3,"join"],[3,"Auth"],[3,"INTERNAL_SERVER_ERROR_BODY"],[3,"UNKNOWN_ERROR_BODY"],[3,"ErrorPage"],[3,"Errors"],[3,"IndexPage"],[3,"panel"],[3,"Panel"],[3,"INDEX"],[3,"IndexPage"],[3,"add_sitekey"],[3,"IndexPage"],[3,"list_sitekeys"],[3,"Sitekey"],[3,"McaptchaConfig"],[3,"Level"],[3,"IndexPage"],[3,"view_sitekey"],[3,"Routes"],[4,"Methods"],[3,"Server"],[3,"Captcha"],[3,"Smtp"],[3,"DatabaseBuilder"],[3,"Database"],[3,"Redis"],[3,"FileMap"],[3,"Asset"],[3,"static_files"],[3,"Favicons"],[3,"favicons"],[3,"Stats"],[3,"INDEX_PAGE"],[3,"IndexPage"],[3,"show_widget"],[3,"WidgetAssets"],[3,"widget_assets"],[3,"Widget"]]},\ +"tests_migrate":{"doc":"","t":[3,3,3,12,11,11,5,5,12,12,0,12,12,12,11,11,11,11,12,5,12,12,12,0,12,12,11,11,11,11,3,13,6,13,4,11,11,11,11,12,12,12,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,3,3,3,3,3,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,12,11,11,11,11,11,11,11,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,5,5,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,11,11,11,11,11,11,11],"n":["Data","SETTINGS","Settings","__private_field","borrow","borrow_mut","build","cache_bust","captcha","creds","data","database","db","debug","deref","from","initialize","into","mailer","main","pow","redis","server","settings","smtp","source_code","try_from","try_into","type_id","vzip","Data","Embedded","Mailer","Redis","SystemGroup","borrow","borrow","borrow_mut","borrow_mut","captcha","creds","db","from","from","get_mailer","get_pow","into","into","mailer","new","new","new_system","try_from","try_from","try_into","try_into","type_id","type_id","validate_verification_tokens","verify_pow","vzip","vzip","Captcha","Database","DatabaseBuilder","Redis","Server","Settings","Smtp","allow_registration","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","check_url","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cookie_secret","database","debug","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","domain","extract_database_url","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","gc","get_ip","hostname","into","into","into","into","into","into","into","ip","name","new","password","password","pool","pool","port","port","port","pow","redis","reply_to","salt","server","set_database_url","set_from_database_url","smtp","source_code","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","url","url","url","url","url_prefix","username","username","vzip","vzip","vzip","vzip","vzip","vzip","vzip"],"q":["tests_migrate","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","tests_migrate::data","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","tests_migrate::settings","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["App data","","","","","","","","mCaptcha system: Redis cache, etc.","credential management configuration","App data: redis cache, database connections, etc.","","databse pool","","","","","","email client","","","","","","","","","","","","App data","","Mailer data type AsyncSmtpTransport","","Represents mCaptcha cache and master system. When Redis …","","","","","mCaptcha system: Redis cache, etc.","credential management configuration","databse pool","","","","utility function to get difficulty factor of site id and …","","","email client","","create new instance of app data","","","","","","","","utility function to validate verification tokens","utility function to verify [Work]","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[0,0,0,1,1,1,0,0,2,2,0,3,2,3,1,1,1,1,2,0,3,3,3,0,3,3,1,1,1,1,0,4,0,4,0,4,2,4,2,2,2,2,4,2,2,4,4,2,2,4,2,4,4,2,4,2,4,2,4,4,4,2,0,0,0,0,0,0,0,5,5,6,7,8,9,10,3,5,6,7,8,9,10,3,0,5,6,7,8,9,10,3,5,6,7,8,9,10,3,5,3,3,5,6,7,8,9,10,3,5,8,5,6,7,8,9,10,3,5,6,7,8,9,10,3,7,6,5,8,5,6,7,8,9,10,3,5,8,3,7,8,9,10,5,7,8,3,3,7,6,3,0,0,3,3,5,6,7,8,9,10,3,5,6,7,8,9,10,3,5,6,7,8,9,10,3,5,6,7,8,9,10,3,7,8,9,10,5,7,8,5,6,7,8,9,10,3],"f":[null,null,null,null,[[]],[[]],[[]],[[]],null,null,null,null,null,null,[[],["settings",3]],[[]],[[]],[[]],null,[[]],null,null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[]],null,null,null,null,null,[[]],[[]],[[]],[[]],null,null,null,[[]],[[]],[[],[["asyncsmtptransport",3],["option",4]]],[[["string",3]]],[[]],[[]],null,[[]],[[]],[[["addr",3],["save",8],["mastertrait",8],["addr",3]],[["system",3],["mastertrait",8],["save",8]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[["verifycaptcharesult",3]]],[[["work",3]]],[[]],[[]],null,null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["config",3]]],[[],["server",3]],[[],["captcha",3]],[[],["smtp",3]],[[],["databasebuilder",3]],[[],["database",3]],[[],["redis",3]],[[],["settings",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[["url",3]]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[],[["result",4],["configerror",4]]],null,null,null,null,null,null,null,null,null,null,null,null,[[["config",3]]],[[["databasebuilder",3],["config",3]]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],[[],["typeid",3]],null,null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]]],"p":[[3,"SETTINGS"],[3,"Data"],[3,"Settings"],[4,"SystemGroup"],[3,"Server"],[3,"Captcha"],[3,"Smtp"],[3,"DatabaseBuilder"],[3,"Database"],[3,"Redis"]]}\ }'); -addSearchOptions(searchIndex);initSearch(searchIndex); \ No newline at end of file +if (window.initSearch) {window.initSearch(searchIndex)}; \ No newline at end of file diff --git a/search.js b/search.js new file mode 100644 index 00000000..b2fd05d4 --- /dev/null +++ b/search.js @@ -0,0 +1 @@ +(function(){var itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive","traitalias"];var TY_PRIMITIVE=itemTypes.indexOf("primitive");var TY_KEYWORD=itemTypes.indexOf("keyword");function printTab(nb){if(nb===0||nb===1||nb===2){searchState.currentTab=nb}var nb_copy=nb;onEachLazy(document.getElementById("titles").childNodes,function(elem){if(nb_copy===0){addClass(elem,"selected")}else{removeClass(elem,"selected")}nb_copy-=1});onEachLazy(document.getElementById("results").childNodes,function(elem){if(nb===0){elem.style.display=""}else{elem.style.display="none"}nb-=1})}function removeEmptyStringsFromArray(x){for(var i=0,len=x.length;i-1){var obj=searchIndex[results[i].id];obj.lev=results[i].lev;if(isType!==true||obj.type){var res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}}return out}function sortResults(results,isType){var ar=[];for(var entry in results){if(hasOwnProperty(results,entry)){ar.push(results[entry])}}results=ar;var i,len,result;for(i=0,len=results.length;ib?+1:-1)}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1}a=(aaa.item.desc==="");b=(bbb.item.desc==="");if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});for(i=0,len=results.length;i"));return{name:val.substring(0,val.indexOf("<")),generics:values.split(/\s*,\s*/),}}return{name:val,generics:[],}}function getObjectNameFromId(id){if(typeof id==="number"){return searchIndex[id].name}return id}function checkGenerics(obj,val){var tmp_lev,elem_name;if(val.generics.length>0){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=Object.create(null);var elength=object[GENERICS_DATA].length;for(var x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length>=val.generics.length){var elems=Object.create(null);len=obj[GENERICS_DATA].length;for(x=0;xGENERICS_DATA&&obj[GENERICS_DATA].length!==0){var tmp_lev=checkGenerics(obj,val);if(tmp_lev<=MAX_LEV_DISTANCE){return tmp_lev}}else{return 0}}if(literalSearch===true){if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){return obj[GENERICS_DATA].some(function(name){return name===val.name})}return false}lev_distance=Math.min(levenshtein(obj[NAME],val.name),lev_distance);if(lev_distance<=MAX_LEV_DISTANCE){lev_distance=Math.ceil((checkGenerics(obj,val)+lev_distance)/2)}else if(obj.length>GENERICS_DATA&&obj[GENERICS_DATA].length>0){var olength=obj[GENERICS_DATA].length;for(x=0;x0){var length=obj.type[INPUTS_DATA].length;for(var i=0;iOUTPUT_DATA){var ret=obj.type[OUTPUT_DATA];if(typeof ret[0]==="string"){ret=[ret]}for(var x=0,len=ret.length;xlength){return MAX_LEV_DISTANCE+1}for(var i=0;ilength){break}var lev_total=0;var aborted=false;for(var x=0;xMAX_LEV_DISTANCE){aborted=true;break}lev_total+=lev}if(aborted===false){ret_lev=Math.min(ret_lev,Math.round(lev_total/clength))}}return ret_lev}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER)return true;if(filter===type)return true;var name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,desc:item.desc,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,}}function handleAliases(ret,query,filterCrates){var aliases=[];var crateAliases=[];if(filterCrates!==undefined){if(ALIASES[filterCrates]&&ALIASES[filterCrates][query.search]){var query_aliases=ALIASES[filterCrates][query.search];var len=query_aliases.length;for(var i=0;iMAX_RESULTS){ret.others.pop()}};onEach(aliases,pushFunc);onEach(crateAliases,pushFunc)}var nSearchWords=searchWords.length;var i,it;var ty;var fullId;var returned;var in_args;var len;if((val.charAt(0)==="\""||val.charAt(0)==="'")&&val.charAt(val.length-1)===val.charAt(0)){val=extractGenerics(val.substr(1,val.length-2));for(i=0;i")>-1){var trimmer=function(s){return s.trim()};var parts=val.split("->").map(trimmer);var input=parts[0];var inputs=input.split(",").map(trimmer).sort();for(i=0,len=inputs.length;i1?paths.length-1:1);var lev,j;for(j=0;j1){lev=checkPath(contains,paths[paths.length-1],ty);if(lev>MAX_LEV_DISTANCE){continue}else if(lev>0){lev_add=lev/10}}returned=MAX_LEV_DISTANCE+1;in_args=MAX_LEV_DISTANCE+1;var index=-1;lev=MAX_LEV_DISTANCE+1;fullId=ty.id;if(searchWords[j].indexOf(split[i])>-1||searchWords[j].indexOf(val)>-1||ty.normalizedName.indexOf(val)>-1){if(typePassesFilter(typeFilter,ty.ty)&&results[fullId]===undefined){index=ty.normalizedName.indexOf(val)}}if((lev=levenshtein(searchWords[j],val))<=MAX_LEV_DISTANCE){if(typePassesFilter(typeFilter,ty.ty)===false){lev=MAX_LEV_DISTANCE+1}else{lev+=1}}in_args=findArg(ty,valGenerics,false,typeFilter);returned=checkReturned(ty,valGenerics,false,typeFilter);lev+=lev_add;if(lev>0&&val.length>3&&searchWords[j].indexOf(val)>-1){if(val.length<6){lev-=1}else{lev=0}}if(in_args<=MAX_LEV_DISTANCE){if(results_in_args[fullId]===undefined){results_in_args[fullId]={id:j,index:index,lev:in_args,}}results_in_args[fullId].lev=Math.min(results_in_args[fullId].lev,in_args)}if(returned<=MAX_LEV_DISTANCE){if(results_returned[fullId]===undefined){results_returned[fullId]={id:j,index:index,lev:returned,}}results_returned[fullId].lev=Math.min(results_returned[fullId].lev,returned)}if(index!==-1||lev<=MAX_LEV_DISTANCE){if(index!==-1&&paths.length<2){lev=0}if(results[fullId]===undefined){results[fullId]={id:j,index:index,lev:lev,}}results[fullId].lev=Math.min(results[fullId].lev,lev)}}}var ret={"in_args":sortResults(results_in_args,true),"returned":sortResults(results_returned,true),"others":sortResults(results),};handleAliases(ret,query,filterCrates);return ret}function validateResult(name,path,keys,parent){for(var i=0,len=keys.length;i-1||path.indexOf(keys[i])>-1||(parent!==undefined&&parent.name!==undefined&&parent.name.toLowerCase().indexOf(keys[i])>-1)||levenshtein(name,keys[i])<=MAX_LEV_DISTANCE)){return false}}return true}function getQuery(raw){var matches,type,query;query=raw;matches=query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i);if(matches){type=matches[1].replace(/^const$/,"constant");query=query.substring(matches[0].length)}return{raw:raw,query:query,type:type,id:query+type}}function initSearchNav(){var hoverTimeout;var click_func=function(e){var el=e.target;while(el.tagName!=="TR"){el=el.parentNode}var dst=e.target.getElementsByTagName("a");if(dst.length<1){return}dst=dst[0];if(window.location.pathname===dst.pathname){searchState.hideResults();document.location.href=dst.href}};var mouseover_func=function(e){if(searchState.mouseMovedAfterSearch){var el=e.target;while(el.tagName!=="TR"){el=el.parentNode}clearTimeout(hoverTimeout);hoverTimeout=setTimeout(function(){onEachLazy(document.getElementsByClassName("search-results"),function(e){onEachLazy(e.getElementsByClassName("result"),function(i_e){removeClass(i_e,"highlighted")})});addClass(el,"highlighted")},20)}};onEachLazy(document.getElementsByClassName("search-results"),function(e){onEachLazy(e.getElementsByClassName("result"),function(i_e){i_e.onclick=click_func;i_e.onmouseover=mouseover_func})});searchState.input.onkeydown=function(e){var actives=[[],[],[]];var current=0;onEachLazy(document.getElementById("results").childNodes,function(e){onEachLazy(e.getElementsByClassName("highlighted"),function(h_e){actives[current].push(h_e)});current+=1});var SHIFT=16;var CTRL=17;var ALT=18;var currentTab=searchState.currentTab;if(e.which===38){if(e.ctrlKey){printTab(currentTab>0?currentTab-1:2)}else{if(!actives[currentTab].length||!actives[currentTab][0].previousElementSibling){return}addClass(actives[currentTab][0].previousElementSibling,"highlighted");removeClass(actives[currentTab][0],"highlighted")}e.preventDefault()}else if(e.which===40){if(e.ctrlKey){printTab(currentTab>1?0:currentTab+1)}else if(!actives[currentTab].length){var results=document.getElementById("results").childNodes;if(results.length>0){var res=results[currentTab].getElementsByClassName("result");if(res.length>0){addClass(res[0],"highlighted")}}}else if(actives[currentTab][0].nextElementSibling){addClass(actives[currentTab][0].nextElementSibling,"highlighted");removeClass(actives[currentTab][0],"highlighted")}e.preventDefault()}else if(e.which===13){if(actives[currentTab].length){var elem=actives[currentTab][0].getElementsByTagName("a")[0];document.location.href=elem.href}}else if([SHIFT,CTRL,ALT].indexOf(e.which)!==-1){}else if(actives[currentTab].length>0){removeClass(actives[currentTab][0],"highlighted")}}}function buildHrefAndPath(item){var displayPath;var href;var type=itemTypes[item.ty];var name=item.name;var path=item.path;if(type==="mod"){displayPath=path+"::";href=window.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="primitive"||type==="keyword"){displayPath="";href=window.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=window.rootPath+name+"/index.html"}else if(item.parent!==undefined){var myparent=item.parent;var anchor="#"+type+"."+name;var parentType=itemTypes[myparent.ty];var pageType=parentType;var pageName=myparent.name;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){var enumNameIdx=item.path.lastIndexOf("::");var enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="#variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}href=window.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html"+anchor}else{displayPath=item.path+"::";href=window.rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href]}function escape(content){var h1=document.createElement("h1");h1.textContent=content;return h1.innerHTML}function pathSplitter(path){var tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}function addTab(array,query,display){var extraStyle="";if(display===false){extraStyle=" style=\"display: none;\""}var output="";var duplicates={};var length=0;if(array.length>0){output="";array.forEach(function(item){var name,type;name=item.name;type=itemTypes[item.ty];if(item.is_alias!==true){if(duplicates[item.fullPath]){return}duplicates[item.fullPath]=true}length+=1;output+=""});output+="
"+""+(item.is_alias===true?(""+item.alias+"  - see "):"")+item.displayPath+""+name+""+""+""+item.desc+" 
"}else{output="
No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:
"}return[output,length]}function makeTabHeader(tabNb,text,nbElems){if(searchState.currentTab===tabNb){return""}return""}function showResults(results){var search=searchState.outputElement();if(results.others.length===1&&getSettingValue("go-to-only-result")==="true"&&(!search.firstChild||search.firstChild.innerText!==searchState.loadingText)){var elem=document.createElement("a");elem.href=results.others[0].href;elem.style.display="none";document.body.appendChild(elem);elem.click();return}var query=getQuery(searchState.input.value);currentResults=query.id;var ret_others=addTab(results.others,query);var ret_in_args=addTab(results.in_args,query,false);var ret_returned=addTab(results.returned,query,false);var currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}var output="

Results for "+escape(query.query)+(query.type?" (type: "+escape(query.type)+")":"")+"

"+"
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"+ret_others[0]+ret_in_args[0]+ret_returned[0]+"
";search.innerHTML=output;searchState.showResults(search);initSearchNav();var elems=document.getElementById("titles").childNodes;elems[0].onclick=function(){printTab(0)};elems[1].onclick=function(){printTab(1)};elems[2].onclick=function(){printTab(2)};printTab(currentTab)}function execSearch(query,searchWords,filterCrates){function getSmallest(arrays,positions,notDuplicates){var start=null;for(var it=0,len=positions.length;itpositions[it]&&(start===null||start>arrays[it][positions[it]].lev)&&!notDuplicates[arrays[it][positions[it]].fullPath]){start=arrays[it][positions[it]].lev}}return start}function mergeArrays(arrays){var ret=[];var positions=[];var notDuplicates={};for(var x=0,arrays_len=arrays.length;xpositions[x]&&arrays[x][positions[x]].lev===smallest&&!notDuplicates[arrays[x][positions[x]].fullPath]){ret.push(arrays[x][positions[x]]);notDuplicates[arrays[x][positions[x]].fullPath]=true;positions[x]+=1}}}return ret}var queries=query.raw.split(",");var results={"in_args":[],"returned":[],"others":[],};for(var i=0,len=queries.length;i1){return{"in_args":mergeArrays(results.in_args),"returned":mergeArrays(results.returned),"others":mergeArrays(results.others),}}return{"in_args":results.in_args[0],"returned":results.returned[0],"others":results.others[0],}}function getFilterCrates(){var elem=document.getElementById("crate-search");if(elem&&elem.value!=="All crates"&&hasOwnProperty(rawSearchIndex,elem.value)){return elem.value}return undefined}function search(e,forced){var params=searchState.getQueryStringParams();var query=getQuery(searchState.input.value.trim());if(e){e.preventDefault()}if(query.query.length===0){return}if(forced!==true&&query.id===currentResults){if(query.query.length>0){searchState.putBackSearch(searchState.input)}return}searchState.title="Results for "+query.query+" - Rust";if(searchState.browserSupportsHistoryApi()){var newURL=getNakedUrl()+"?search="+encodeURIComponent(query.raw)+window.location.hash;if(!history.state&&!params.search){history.pushState(query,"",newURL)}else{history.replaceState(query,"",newURL)}}var filterCrates=getFilterCrates();showResults(execSearch(query,index,filterCrates))}function buildIndex(rawSearchIndex){searchIndex=[];var searchWords=[];var i,word;var currentIndex=0;var id=0;for(var crate in rawSearchIndex){if(!hasOwnProperty(rawSearchIndex,crate)){continue}var crateSize=0;searchWords.push(crate);var normalizedName=crate.indexOf("_")===-1?crate:crate.replace(/_/g,"");var crateRow={crate:crate,ty:1,name:crate,path:"",desc:rawSearchIndex[crate].doc,parent:undefined,type:null,id:id,normalizedName:normalizedName,};id+=1;searchIndex.push(crateRow);currentIndex+=1;var itemTypes=rawSearchIndex[crate].t;var itemNames=rawSearchIndex[crate].n;var itemPaths=rawSearchIndex[crate].q;var itemDescs=rawSearchIndex[crate].d;var itemParentIdxs=rawSearchIndex[crate].i;var itemFunctionSearchTypes=rawSearchIndex[crate].f;var paths=rawSearchIndex[crate].p;var aliases=rawSearchIndex[crate].a;var len=paths.length;for(i=0;i0?paths[itemParentIdxs[i]-1]:undefined,type:itemFunctionSearchTypes[i],id:id,normalizedName:normalizedName,};id+=1;searchIndex.push(row);lastPath=row.path;crateSize+=1}if(aliases){ALIASES[crate]={};var j,local_aliases;for(var alias_name in aliases){if(!aliases.hasOwnProperty(alias_name)){continue}if(!ALIASES[crate].hasOwnProperty(alias_name)){ALIASES[crate][alias_name]=[]}local_aliases=aliases[alias_name];for(j=0,len=local_aliases.length;j0){searchState.input.value=params.search;search(e)}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=function(){var qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}index=buildIndex(rawSearchIndex);registerSearchEvents();if(searchState.getQueryStringParams().search){search()}};if(window.searchIndex!==undefined){initSearch(window.searchIndex)}})() \ No newline at end of file diff --git a/settings.html b/settings.html index d6b5b18f..0e239081 100644 --- a/settings.html +++ b/settings.html @@ -1,7 +1,6 @@ -Rustdoc settings +Rustdoc settings -

Rustdoc settings

Theme preferences
Use system theme
Preferred dark theme
Preferred light theme
-
Auto-hide item declarations
Auto-hide structs declaration
Auto-hide enums declaration
Auto-hide unions declaration
Auto-hide traits declaration
Auto-hide macros declaration
-
Auto-hide item attributes.
Auto-hide item methods' documentation
Auto-hide trait implementation documentation
Auto-hide implementors of a trait
Directly go to item in search if there is only one result
Show line numbers on code examples
Disable keyboard shortcuts
- \ No newline at end of file +

Rustdoc settings

Theme preferences
Use system theme
Preferred dark theme
Preferred light theme
+
Auto-hide item contents for large items.
Auto-hide item methods' documentation
Auto-hide trait implementation documentation
Auto-hide implementors of a trait
Directly go to item in search if there is only one result
Show line numbers on code examples
Disable keyboard shortcuts
+ \ No newline at end of file diff --git a/sidebar-items.js b/sidebar-items.js new file mode 100644 index 00000000..431587a6 --- /dev/null +++ b/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({}) \ No newline at end of file diff --git a/source-files.js b/source-files.js index 88fe2ba4..29027f8a 100644 --- a/source-files.js +++ b/source-files.js @@ -1,4 +1,4 @@ var N = null;var sourcesIndex = {}; -sourcesIndex["mcaptcha"] = {"name":"","dirs":[{"name":"api","dirs":[{"name":"v1","dirs":[{"name":"account","files":["delete.rs","email.rs","mod.rs","secret.rs","username.rs"]},{"name":"mcaptcha","files":["captcha.rs","duration.rs","levels.rs","mod.rs"]},{"name":"notifications","files":["add.rs","get.rs","mark_read.rs","mod.rs"]},{"name":"pow","files":["get_config.rs","mod.rs","verify_pow.rs","verify_token.rs"]}],"files":["auth.rs","meta.rs","mod.rs","routes.rs"]}],"files":["mod.rs"]},{"name":"middleware","files":["auth.rs","mod.rs"]},{"name":"pages","dirs":[{"name":"auth","files":["login.rs","mod.rs","register.rs"]},{"name":"panel","dirs":[{"name":"sitekey","files":["add.rs","list.rs","mod.rs","view.rs"]}],"files":["mod.rs"]}],"files":["errors.rs","mod.rs","routes.rs"]},{"name":"static_assets","files":["filemap.rs","mod.rs","static_files.rs"]},{"name":"stats","files":["fetch.rs","mod.rs","record.rs"]},{"name":"widget","files":["mod.rs"]}],"files":["data.rs","docs.rs","errors.rs","main.rs","routes.rs","settings.rs"]}; +sourcesIndex["mcaptcha"] = {"name":"","dirs":[{"name":"api","dirs":[{"name":"v1","dirs":[{"name":"account","files":["delete.rs","email.rs","mod.rs","secret.rs","username.rs"]},{"name":"mcaptcha","files":["captcha.rs","duration.rs","levels.rs","mod.rs"]},{"name":"notifications","files":["add.rs","get.rs","mark_read.rs","mod.rs"]},{"name":"pow","files":["get_config.rs","mod.rs","verify_pow.rs","verify_token.rs"]}],"files":["auth.rs","meta.rs","mod.rs","routes.rs"]}],"files":["mod.rs"]},{"name":"email","files":["mod.rs","verification.rs"]},{"name":"middleware","files":["auth.rs","mod.rs"]},{"name":"pages","dirs":[{"name":"auth","files":["login.rs","mod.rs","register.rs"]},{"name":"panel","dirs":[{"name":"sitekey","files":["add.rs","list.rs","mod.rs","view.rs"]}],"files":["mod.rs"]}],"files":["errors.rs","mod.rs","routes.rs"]},{"name":"static_assets","files":["filemap.rs","mod.rs","static_files.rs"]},{"name":"stats","files":["fetch.rs","mod.rs","record.rs"]},{"name":"widget","files":["mod.rs"]}],"files":["data.rs","docs.rs","errors.rs","main.rs","routes.rs","settings.rs"]}; sourcesIndex["tests_migrate"] = {"name":"","files":["data.rs","settings.rs","tests-migrate.rs"]}; createSourceSidebar(); diff --git a/src/mcaptcha/api/mod.rs.html b/src/mcaptcha/api/mod.rs.html index a298cc72..d6e7e919 100644 --- a/src/mcaptcha/api/mod.rs.html +++ b/src/mcaptcha/api/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -39,5 +39,5 @@
 
 pub mod v1;
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/account/delete.rs.html b/src/mcaptcha/api/v1/account/delete.rs.html index 5c66e132..01c7d4ce 100644 --- a/src/mcaptcha/api/v1/account/delete.rs.html +++ b/src/mcaptcha/api/v1/account/delete.rs.html @@ -1,7 +1,7 @@ -delete.rs - source +delete.rs - source -
 1
+
 1
  2
  3
  4
@@ -86,28 +86,28 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 
-use super::auth::runners::Password;
-use crate::errors::*;
-use crate::AppData;
+use super::auth::runners::Password;
+use crate::errors::*;
+use crate::AppData;
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.account.delete",
     wrap = "crate::CheckLogin"
 )]
 async fn delete_account(
     id: Identity,
-    payload: web::Json<Password>,
+    payload: web::Json<Password>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    use argon2_creds::Config;
-    use sqlx::Error::RowNotFound;
+    use argon2_creds::Config;
+    use sqlx::Error::RowNotFound;
 
     let username = id.identity().unwrap();
 
-    let rec = sqlx::query_as!(
+    let rec = sqlx::query_as!(
         Password,
         r#"SELECT password  FROM mcaptcha_users WHERE name = ($1)"#,
         &username,
@@ -119,23 +119,23 @@
 
     match rec {
         Ok(s) => {
-            if Config::verify(&s.password, &payload.password)? {
-                sqlx::query!("DELETE FROM mcaptcha_users WHERE name = ($1)", &username)
+            if Config::verify(&s.password, &payload.password)? {
+                sqlx::query!("DELETE FROM mcaptcha_users WHERE name = ($1)", &username)
                     .execute(&data.db)
                     .await?;
-                Ok(HttpResponse::Ok())
+                Ok(HttpResponse::Ok())
             } else {
-                Err(ServiceError::WrongPassword)
+                Err(ServiceError::WrongPassword)
             }
         }
-        Err(RowNotFound) => Err(ServiceError::UsernameNotFound),
-        Err(_) => Err(ServiceError::InternalServerError),
+        Err(RowNotFound) => Err(ServiceError::UsernameNotFound),
+        Err(_) => Err(ServiceError::InternalServerError),
     }
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
     cfg.service(delete_account);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/account/email.rs.html b/src/mcaptcha/api/v1/account/email.rs.html index d2a5062e..fd9aa1db 100644 --- a/src/mcaptcha/api/v1/account/email.rs.html +++ b/src/mcaptcha/api/v1/account/email.rs.html @@ -1,7 +1,7 @@ -email.rs - source +email.rs - source -
 1
+
 1
  2
  3
  4
@@ -112,27 +112,27 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::borrow::Cow;
+use std::borrow::Cow;
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 
 use super::{AccountCheckPayload, AccountCheckResp};
-use crate::errors::*;
-use crate::AppData;
+use crate::errors::*;
+use crate::AppData;
 
 #[derive(Clone, Debug, Deserialize, Serialize)]
 pub struct Email {
     pub email: String,
 }
 
-#[my_codegen::post(path = "crate::V1_API_ROUTES.account.email_exists")]
+#[my_codegen::post(path = "crate::V1_API_ROUTES.account.email_exists")]
 pub async fn email_exists(
-    payload: web::Json<AccountCheckPayload>,
+    payload: web::Json<AccountCheckPayload>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    let res = sqlx::query!(
+    let res = sqlx::query!(
         "SELECT EXISTS (SELECT 1 from mcaptcha_users WHERE email = $1)",
         &payload.val,
     )
@@ -147,24 +147,24 @@
         }
     }
 
-    Ok(HttpResponse::Ok().json(resp))
+    Ok(HttpResponse::Ok().json(resp))
 }
 
 /// update email
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.account.update_email",
     wrap = "crate::CheckLogin"
 )]
 async fn set_email(
     id: Identity,
-    payload: web::Json<Email>,
+    payload: web::Json<Email>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
 
     data.creds.email(&payload.email)?;
 
-    let res = sqlx::query!(
+    let res = sqlx::query!(
         "UPDATE mcaptcha_users set email = $1
         WHERE name = $2",
         &payload.email,
@@ -173,23 +173,23 @@
     .execute(&data.db)
     .await;
     if res.is_err() {
-        if let Err(sqlx::Error::Database(err)) = res {
-            if err.code() == Some(Cow::from("23505"))
+        if let Err(sqlx::Error::Database(err)) = res {
+            if err.code() == Some(Cow::from("23505"))
                 && err.message().contains("mcaptcha_users_email_key")
             {
-                return Err(ServiceError::EmailTaken);
+                return Err(ServiceError::EmailTaken);
             } else {
-                return Err(sqlx::Error::Database(err).into());
+                return Err(sqlx::Error::Database(err).into());
             }
         };
     }
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
     cfg.service(email_exists);
     cfg.service(set_email);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/account/mod.rs.html b/src/mcaptcha/api/v1/account/mod.rs.html index c79ff89c..0a240757 100644 --- a/src/mcaptcha/api/v1/account/mod.rs.html +++ b/src/mcaptcha/api/v1/account/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -105,8 +105,8 @@
 pub mod test;
 pub mod username;
 
-pub use super::auth;
-pub use super::mcaptcha;
+pub use super::auth;
+pub use super::mcaptcha;
 
 pub mod routes {
 
@@ -150,12 +150,12 @@
     pub exists: bool,
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
-    delete::services(cfg);
-    email::services(cfg);
-    username::services(cfg);
-    secret::services(cfg);
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+    delete::services(cfg);
+    email::services(cfg);
+    username::services(cfg);
+    secret::services(cfg);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/account/secret.rs.html b/src/mcaptcha/api/v1/account/secret.rs.html index 08b64b08..052284df 100644 --- a/src/mcaptcha/api/v1/account/secret.rs.html +++ b/src/mcaptcha/api/v1/account/secret.rs.html @@ -1,7 +1,7 @@ -secret.rs - source +secret.rs - source -
 1
+
 1
  2
  3
  4
@@ -108,29 +108,29 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::borrow::Cow;
+use std::borrow::Cow;
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 
-use crate::api::v1::mcaptcha::get_random;
-use crate::errors::*;
-use crate::AppData;
+use crate::api::v1::mcaptcha::get_random;
+use crate::errors::*;
+use crate::AppData;
 
 #[derive(Clone, Debug, Deserialize, Serialize)]
 pub struct Secret {
     pub secret: String,
 }
 
-#[my_codegen::get(
+#[my_codegen::get(
     path = "crate::V1_API_ROUTES.account.get_secret",
     wrap = "crate::CheckLogin"
 )]
 async fn get_secret(id: Identity, data: AppData) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
 
-    let secret = sqlx::query_as!(
+    let secret = sqlx::query_as!(
         Secret,
         r#"SELECT secret  FROM mcaptcha_users WHERE name = ($1)"#,
         &username,
@@ -138,10 +138,10 @@
     .fetch_one(&data.db)
     .await?;
 
-    Ok(HttpResponse::Ok().json(secret))
+    Ok(HttpResponse::Ok().json(secret))
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.account.update_secret",
     wrap = "crate::CheckLogin"
 )]
@@ -155,7 +155,7 @@
 
     loop {
         secret = get_random(32);
-        let res = sqlx::query!(
+        let res = sqlx::query!(
             "UPDATE mcaptcha_users set secret = $1
         WHERE name = $2",
             &secret,
@@ -165,23 +165,23 @@
         .await;
         if res.is_ok() {
             break;
-        } else if let Err(sqlx::Error::Database(err)) = res {
-            if err.code() == Some(Cow::from("23505"))
+        } else if let Err(sqlx::Error::Database(err)) = res {
+            if err.code() == Some(Cow::from("23505"))
                 && err.message().contains("mcaptcha_users_secret_key")
             {
                 continue;
             } else {
-                return Err(sqlx::Error::Database(err).into());
+                return Err(sqlx::Error::Database(err).into());
             }
         }
     }
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
     cfg.service(get_secret);
     cfg.service(update_user_secret);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/account/username.rs.html b/src/mcaptcha/api/v1/account/username.rs.html index 1b908dbe..796784c4 100644 --- a/src/mcaptcha/api/v1/account/username.rs.html +++ b/src/mcaptcha/api/v1/account/username.rs.html @@ -1,7 +1,7 @@ -username.rs - source +username.rs - source -
 1
+
 1
  2
  3
  4
@@ -69,15 +69,15 @@
 use actix_web::{web, HttpResponse, Responder};
 
 use super::{AccountCheckPayload, AccountCheckResp};
-use crate::errors::*;
-use crate::AppData;
+use crate::errors::*;
+use crate::AppData;
 
-#[my_codegen::post(path = "crate::V1_API_ROUTES.account.username_exists")]
+#[my_codegen::post(path = "crate::V1_API_ROUTES.account.username_exists")]
 async fn username_exists(
-    payload: web::Json<AccountCheckPayload>,
+    payload: web::Json<AccountCheckPayload>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    let res = sqlx::query!(
+    let res = sqlx::query!(
         "SELECT EXISTS (SELECT 1 from mcaptcha_users WHERE name = $1)",
         &payload.val,
     )
@@ -92,12 +92,12 @@
         }
     }
 
-    Ok(HttpResponse::Ok().json(resp))
+    Ok(HttpResponse::Ok().json(resp))
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
     cfg.service(username_exists);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/auth.rs.html b/src/mcaptcha/api/v1/auth.rs.html index 144da2fa..9503b1c2 100644 --- a/src/mcaptcha/api/v1/auth.rs.html +++ b/src/mcaptcha/api/v1/auth.rs.html @@ -1,7 +1,7 @@ -auth.rs - source +auth.rs - source -
  1
+
  1
   2
   3
   4
@@ -232,7 +232,6 @@
 229
 230
 231
-232
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -251,15 +250,15 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
-use actix_web::http::header;
+use actix_identity::Identity;
+use actix_web::http::header;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 //use futures::{future::TryFutureExt, join};
 
-use super::mcaptcha::get_random;
-use crate::errors::*;
-use crate::AppData;
+use super::mcaptcha::get_random;
+use crate::errors::*;
+use crate::AppData;
 
 pub mod routes {
     pub struct Auth {
@@ -283,7 +282,7 @@
 }
 
 pub mod runners {
-    use std::borrow::Cow;
+    use std::borrow::Cow;
 
     use super::*;
 
@@ -310,14 +309,14 @@
 
     /// returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise
     pub async fn login_runner(payload: Login, data: &AppData) -> ServiceResult<String> {
-        use argon2_creds::Config;
-        use sqlx::Error::RowNotFound;
+        use argon2_creds::Config;
+        use sqlx::Error::RowNotFound;
 
         let verify = |stored: &str, received: &str| {
-            if Config::verify(&stored, &received)? {
+            if Config::verify(&stored, &received)? {
                 Ok(())
             } else {
-                Err(ServiceError::WrongPassword)
+                Err(ServiceError::WrongPassword)
             }
         };
 
@@ -328,7 +327,7 @@
                 password: String,
             }
 
-            let email_fut = sqlx::query_as!(
+            let email_fut = sqlx::query_as!(
                 EmailLogin,
                 r#"SELECT name, password  FROM mcaptcha_users WHERE email = ($1)"#,
                 &payload.login,
@@ -342,11 +341,11 @@
                     Ok(s.name)
                 }
 
-                Err(RowNotFound) => Err(ServiceError::AccountNotFound),
-                Err(_) => Err(ServiceError::InternalServerError),
+                Err(RowNotFound) => Err(ServiceError::AccountNotFound),
+                Err(_) => Err(ServiceError::InternalServerError),
             }
         } else {
-            let username_fut = sqlx::query_as!(
+            let username_fut = sqlx::query_as!(
                 Password,
                 r#"SELECT password  FROM mcaptcha_users WHERE name = ($1)"#,
                 &payload.login,
@@ -359,8 +358,8 @@
                     verify(&s.password, &payload.password)?;
                     Ok(payload.login)
                 }
-                Err(RowNotFound) => Err(ServiceError::AccountNotFound),
-                Err(_) => Err(ServiceError::InternalServerError),
+                Err(RowNotFound) => Err(ServiceError::AccountNotFound),
+                Err(_) => Err(ServiceError::InternalServerError),
             }
         }
     }
@@ -369,12 +368,12 @@
         payload: &Register,
         data: &AppData,
     ) -> ServiceResult<()> {
-        if !crate::SETTINGS.server.allow_registration {
-            return Err(ServiceError::ClosedForRegistration);
+        if !crate::SETTINGS.server.allow_registration {
+            return Err(ServiceError::ClosedForRegistration);
         }
 
         if payload.password != payload.confirm_password {
-            return Err(ServiceError::PasswordsDontMatch);
+            return Err(ServiceError::PasswordsDontMatch);
         }
         let username = data.creds.username(&payload.username)?;
         let hash = data.creds.password(&payload.password)?;
@@ -389,7 +388,7 @@
             secret = get_random(32);
             let res;
             if let Some(email) = &payload.email {
-                res = sqlx::query!(
+                res = sqlx::query!(
                     "INSERT INTO mcaptcha_users 
         (name , password, email, secret) VALUES ($1, $2, $3, $4)",
                     &username,
@@ -400,7 +399,7 @@
                 .execute(&data.db)
                 .await;
             } else {
-                res = sqlx::query!(
+                res = sqlx::query!(
                     "INSERT INTO mcaptcha_users 
         (name , password,  secret) VALUES ($1, $2, $3)",
                     &username,
@@ -412,18 +411,18 @@
             }
             if res.is_ok() {
                 break;
-            } else if let Err(sqlx::Error::Database(err)) = res {
-                if err.code() == Some(Cow::from("23505")) {
+            } else if let Err(sqlx::Error::Database(err)) = res {
+                if err.code() == Some(Cow::from("23505")) {
                     let msg = err.message();
                     if msg.contains("mcaptcha_users_name_key") {
-                        return Err(ServiceError::UsernameTaken);
+                        return Err(ServiceError::UsernameTaken);
                     } else if msg.contains("mcaptcha_users_secret_key") {
                         continue;
                     } else {
-                        return Err(ServiceError::InternalServerError);
+                        return Err(ServiceError::InternalServerError);
                     }
                 } else {
-                    return Err(sqlx::Error::Database(err).into());
+                    return Err(sqlx::Error::Database(err).into());
                 }
             };
         }
@@ -431,41 +430,40 @@
     }
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
+pub fn services(cfg: &mut web::ServiceConfig) {
     cfg.service(register);
     cfg.service(login);
     cfg.service(signout);
 }
-#[my_codegen::post(path = "crate::V1_API_ROUTES.auth.register")]
+#[my_codegen::post(path = "crate::V1_API_ROUTES.auth.register")]
 async fn register(
-    payload: web::Json<runners::Register>,
+    payload: web::Json<runners::Register>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    runners::register_runner(&payload, &data).await?;
-    Ok(HttpResponse::Ok())
+    runners::register_runner(&payload, &data).await?;
+    Ok(HttpResponse::Ok())
 }
 
-#[my_codegen::post(path = "crate::V1_API_ROUTES.auth.login")]
+#[my_codegen::post(path = "crate::V1_API_ROUTES.auth.login")]
 async fn login(
     id: Identity,
-    payload: web::Json<runners::Login>,
+    payload: web::Json<runners::Login>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    let username = runners::login_runner(payload.into_inner(), &data).await?;
+    let username = runners::login_runner(payload.into_inner(), &data).await?;
     id.remember(username);
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
-#[my_codegen::get(path = "crate::V1_API_ROUTES.auth.logout", wrap = "crate::CheckLogin")]
+#[my_codegen::get(path = "crate::V1_API_ROUTES.auth.logout", wrap = "crate::CheckLogin")]
 async fn signout(id: Identity) -> impl Responder {
     if id.identity().is_some() {
         id.forget();
     }
-    HttpResponse::Found()
-        .header(header::LOCATION, "/login")
+    HttpResponse::Found()
+        .append_header((header::LOCATION, "/login"))
         .finish()
-        .into_body()
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/mcaptcha/captcha.rs.html b/src/mcaptcha/api/v1/mcaptcha/captcha.rs.html index 0d9f856e..315046ae 100644 --- a/src/mcaptcha/api/v1/mcaptcha/captcha.rs.html +++ b/src/mcaptcha/api/v1/mcaptcha/captcha.rs.html @@ -1,7 +1,7 @@ -captcha.rs - source +captcha.rs - source -
  1
+
  1
   2
   3
   4
@@ -339,15 +339,15 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::borrow::Cow;
+use std::borrow::Cow;
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 
-use super::get_random;
-use crate::errors::*;
-use crate::AppData;
+use super::get_random;
+use crate::errors::*;
+use crate::AppData;
 
 pub mod routes {
     pub struct MCaptcha {
@@ -367,7 +367,7 @@
     }
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
+pub fn services(cfg: &mut web::ServiceConfig) {
     cfg.service(update_token);
     cfg.service(delete_mcaptcha);
     cfg.service(get_token);
@@ -400,7 +400,7 @@
     loop {
         key = get_random(32);
 
-        let res = sqlx::query!(
+        let res = sqlx::query!(
             "INSERT INTO mcaptcha_config
         (key, user_id, duration, name)
         VALUES ($1, (SELECT ID FROM mcaptcha_users WHERE name = $2), $3, $4)",
@@ -413,13 +413,13 @@
         .await;
 
         match res {
-            Err(sqlx::Error::Database(err)) => {
-                if err.code() == Some(Cow::from("23505"))
+            Err(sqlx::Error::Database(err)) => {
+                if err.code() == Some(Cow::from("23505"))
                     && err.message().contains("mcaptcha_config_key_key")
                 {
                     continue;
                 } else {
-                    return Err(sqlx::Error::Database(err).into());
+                    return Err(sqlx::Error::Database(err).into());
                 }
             }
             Err(e) => return Err(e.into()),
@@ -436,12 +436,12 @@
     Ok(resp)
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.mcaptcha.update_key",
     wrap = "crate::CheckLogin"
 )]
 async fn update_token(
-    payload: web::Json<MCaptchaDetails>,
+    payload: web::Json<MCaptchaDetails>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
@@ -453,11 +453,11 @@
         let res = update_token_helper(&key, &payload.key, &username, &data).await;
         if res.is_ok() {
             break;
-        } else if let Err(sqlx::Error::Database(err)) = res {
-            if err.code() == Some(Cow::from("23505")) {
+        } else if let Err(sqlx::Error::Database(err)) = res {
+            if err.code() == Some(Cow::from("23505")) {
                 continue;
             } else {
-                return Err(sqlx::Error::Database(err).into());
+                return Err(sqlx::Error::Database(err).into());
             }
         };
     }
@@ -467,7 +467,7 @@
         name: payload.into_inner().name,
     };
 
-    Ok(HttpResponse::Ok().json(resp))
+    Ok(HttpResponse::Ok().json(resp))
 }
 
 async fn update_token_helper(
@@ -475,8 +475,8 @@
     old_key: &str,
     username: &str,
     data: &AppData,
-) -> Result<(), sqlx::Error> {
-    sqlx::query!(
+) -> Result<(), sqlx::Error> {
+    sqlx::query!(
         "UPDATE mcaptcha_config SET key = $1 
         WHERE key = $2 AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $3)",
         &key,
@@ -488,17 +488,17 @@
     Ok(())
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.mcaptcha.get_token",
     wrap = "crate::CheckLogin"
 )]
 async fn get_token(
-    payload: web::Json<MCaptchaDetails>,
+    payload: web::Json<MCaptchaDetails>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
-    let res = match sqlx::query_as!(
+    let res = match sqlx::query_as!(
         MCaptchaDetails,
         "SELECT key, name from mcaptcha_config
         WHERE key = ($1) AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2) ",
@@ -508,7 +508,7 @@
     .fetch_one(&data.db)
     .await
     {
-        Err(sqlx::Error::RowNotFound) => Err(ServiceError::TokenNotFound),
+        Err(sqlx::Error::RowNotFound) => Err(ServiceError::TokenNotFound),
         Ok(m) => Ok(m),
         Err(e) => {
             let e: ServiceError = e.into();
@@ -516,21 +516,21 @@
         }
     }?;
 
-    Ok(HttpResponse::Ok().json(res))
+    Ok(HttpResponse::Ok().json(res))
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.mcaptcha.delete",
     wrap = "crate::CheckLogin"
 )]
 async fn delete_mcaptcha(
-    payload: web::Json<MCaptchaDetails>,
+    payload: web::Json<MCaptchaDetails>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
 
-    sqlx::query!(
+    sqlx::query!(
         "DELETE FROM mcaptcha_config 
         WHERE key = ($1) AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2) ",
         &payload.key,
@@ -538,7 +538,7 @@
     )
     .execute(&data.db)
     .await?;
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
 // Workflow:
@@ -552,98 +552,98 @@
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
 
     use super::*;
-    use crate::api::v1::ROUTES;
-    use crate::tests::*;
+    use crate::api::v1::ROUTES;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn add_mcaptcha_works() {
         const NAME: &str = "testusermcaptcha";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "testusermcaptcha@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         // 1. add mcaptcha token
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let mut app = get_app!(data).await;
 
         // 4. delete token
-        let del_token = test::call_service(
+        let del_token = test::call_service(
             &mut app,
-            post_request!(&token_key, ROUTES.mcaptcha.delete)
+            post_request!(&token_key, ROUTES.mcaptcha.delete)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(del_token.status(), StatusCode::OK);
+        assert_eq!(del_token.status(), StatusCode::OK);
     }
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn update_and_get_mcaptcha_works() {
         const NAME: &str = "updateusermcaptcha";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "testupdateusermcaptcha@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         // 1. add mcaptcha token
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let mut app = get_app!(data).await;
 
         // 2. update token key
-        let update_token_resp = test::call_service(
+        let update_token_resp = test::call_service(
             &mut app,
-            post_request!(&token_key, ROUTES.mcaptcha.update_key)
+            post_request!(&token_key, ROUTES.mcaptcha.update_key)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(update_token_resp.status(), StatusCode::OK);
+        assert_eq!(update_token_resp.status(), StatusCode::OK);
         let updated_token: MCaptchaDetails =
-            test::read_body_json(update_token_resp).await;
+            test::read_body_json(update_token_resp).await;
 
         // get token key with updated key
-        let get_token_resp = test::call_service(
+        let get_token_resp = test::call_service(
             &mut app,
-            post_request!(&updated_token, ROUTES.mcaptcha.get_token)
+            post_request!(&updated_token, ROUTES.mcaptcha.get_token)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_token_resp.status(), StatusCode::OK);
+        assert_eq!(get_token_resp.status(), StatusCode::OK);
 
         // check if they match
         let mut get_token_key: MCaptchaDetails =
-            test::read_body_json(get_token_resp).await;
-        assert_eq!(get_token_key.key, updated_token.key);
+            test::read_body_json(get_token_resp).await;
+        assert_eq!(get_token_key.key, updated_token.key);
 
         get_token_key.key = "nonexistent".into();
 
-        let get_nonexistent_token_resp = test::call_service(
+        let get_nonexistent_token_resp = test::call_service(
             &mut app,
-            post_request!(&get_token_key, ROUTES.mcaptcha.get_token)
+            post_request!(&get_token_key, ROUTES.mcaptcha.get_token)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_nonexistent_token_resp.status(), StatusCode::NOT_FOUND);
+        assert_eq!(get_nonexistent_token_resp.status(), StatusCode::NOT_FOUND);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/mcaptcha/duration.rs.html b/src/mcaptcha/api/v1/mcaptcha/duration.rs.html index 99c06293..7d57b1c5 100644 --- a/src/mcaptcha/api/v1/mcaptcha/duration.rs.html +++ b/src/mcaptcha/api/v1/mcaptcha/duration.rs.html @@ -1,7 +1,7 @@ -duration.rs - source +duration.rs - source -
  1
+
  1
   2
   3
   4
@@ -215,13 +215,13 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 
-use crate::api::v1::mcaptcha::captcha::MCaptchaDetails;
-use crate::errors::*;
-use crate::AppData;
+use crate::api::v1::mcaptcha::captcha::MCaptchaDetails;
+use crate::errors::*;
+use crate::AppData;
 
 pub mod routes {
     pub struct Duration {
@@ -244,19 +244,19 @@
     pub duration: i32,
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.duration.update",
     wrap = "crate::CheckLogin"
 )]
 async fn update_duration(
-    payload: web::Json<UpdateDuration>,
+    payload: web::Json<UpdateDuration>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
 
     if payload.duration > 0 {
-        sqlx::query!(
+        sqlx::query!(
             "UPDATE mcaptcha_config  set duration = $1 
         WHERE key = $2 AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $3)",
             &payload.duration,
@@ -266,11 +266,11 @@
         .execute(&data.db)
         .await?;
 
-        Ok(HttpResponse::Ok())
+        Ok(HttpResponse::Ok())
     } else {
         // when mCaptcha/mCaptcha #2 is fixed, this wont be necessary
-        Err(ServiceError::CaptchaError(
-            libmcaptcha::errors::CaptchaError::CaptchaDurationZero,
+        Err(ServiceError::CaptchaError(
+            libmcaptcha::errors::CaptchaError::CaptchaDurationZero,
         ))
     }
 }
@@ -285,18 +285,18 @@
     pub token: String,
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.duration.get",
     wrap = "crate::CheckLogin"
 )]
 async fn get_duration(
-    payload: web::Json<MCaptchaDetails>,
+    payload: web::Json<MCaptchaDetails>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
 
-    let duration = sqlx::query_as!(
+    let duration = sqlx::query_as!(
         GetDurationResp,
         "SELECT duration FROM mcaptcha_config  
         WHERE key = $1 AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)",
@@ -305,10 +305,10 @@
     )
     .fetch_one(&data.db)
     .await?;
-    Ok(HttpResponse::Ok().json(duration))
+    Ok(HttpResponse::Ok().json(duration))
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
+pub fn services(cfg: &mut web::ServiceConfig) {
     cfg.service(get_duration);
     cfg.service(update_duration);
     //    use crate::define_resource;
@@ -330,29 +330,29 @@
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
 
     use super::*;
-    use crate::api::v1::ROUTES;
-    use crate::tests::*;
+    use crate::api::v1::ROUTES;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn update_duration() {
         const NAME: &str = "testuserduration";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "testuserduration@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let mut app = get_app!(data).await;
 
         let update = UpdateDuration {
             key: token_key.key.clone(),
@@ -361,39 +361,39 @@
 
         // check default
 
-        let get_level_resp = test::call_service(
+        let get_level_resp = test::call_service(
             &mut app,
-            post_request!(&token_key, ROUTES.duration.get)
+            post_request!(&token_key, ROUTES.duration.get)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_level_resp.status(), StatusCode::OK);
-        let res_levels: GetDurationResp = test::read_body_json(get_level_resp).await;
-        assert_eq!(res_levels.duration, 30);
+        assert_eq!(get_level_resp.status(), StatusCode::OK);
+        let res_levels: GetDurationResp = test::read_body_json(get_level_resp).await;
+        assert_eq!(res_levels.duration, 30);
 
         // update and check changes
 
-        let update_duration = test::call_service(
+        let update_duration = test::call_service(
             &mut app,
-            post_request!(&update, ROUTES.duration.update)
+            post_request!(&update, ROUTES.duration.update)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(update_duration.status(), StatusCode::OK);
-        let get_level_resp = test::call_service(
+        assert_eq!(update_duration.status(), StatusCode::OK);
+        let get_level_resp = test::call_service(
             &mut app,
-            post_request!(&token_key, ROUTES.duration.get)
+            post_request!(&token_key, ROUTES.duration.get)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_level_resp.status(), StatusCode::OK);
-        let res_levels: GetDurationResp = test::read_body_json(get_level_resp).await;
-        assert_eq!(res_levels.duration, 40);
+        assert_eq!(get_level_resp.status(), StatusCode::OK);
+        let res_levels: GetDurationResp = test::read_body_json(get_level_resp).await;
+        assert_eq!(res_levels.duration, 40);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/mcaptcha/levels.rs.html b/src/mcaptcha/api/v1/mcaptcha/levels.rs.html index ce0dd5d6..d6b03277 100644 --- a/src/mcaptcha/api/v1/mcaptcha/levels.rs.html +++ b/src/mcaptcha/api/v1/mcaptcha/levels.rs.html @@ -1,7 +1,7 @@ -levels.rs - source +levels.rs - source -
  1
+
  1
   2
   3
   4
@@ -385,16 +385,16 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
-use libmcaptcha::{defense::Level, DefenseBuilder};
-use log::debug;
+use libmcaptcha::{defense::Level, DefenseBuilder};
+use log::debug;
 use serde::{Deserialize, Serialize};
 
-use super::captcha::add_mcaptcha_util;
-use super::captcha::MCaptchaDetails;
-use crate::errors::*;
-use crate::AppData;
+use super::captcha::add_mcaptcha_util;
+use super::captcha::MCaptchaDetails;
+use crate::errors::*;
+use crate::AppData;
 
 pub mod routes {
 
@@ -428,7 +428,7 @@
     pub description: String,
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
+pub fn services(cfg: &mut web::ServiceConfig) {
     cfg.service(add_levels);
     cfg.service(update_levels);
     cfg.service(delete_levels);
@@ -437,13 +437,13 @@
 
 // TODO redo mcaptcha table to include levels as json field
 // so that the whole thing can be added/udpaed in a single stroke
-#[my_codegen::post(path = "crate::V1_API_ROUTES.levels.add", wrap = "crate::CheckLogin")]
+#[my_codegen::post(path = "crate::V1_API_ROUTES.levels.add", wrap = "crate::CheckLogin")]
 async fn add_levels(
-    payload: web::Json<AddLevels>,
+    payload: web::Json<AddLevels>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
-    let mut defense = DefenseBuilder::default();
+    let mut defense = DefenseBuilder::default();
     let username = id.identity().unwrap();
 
     for level in payload.levels.iter() {
@@ -452,16 +452,16 @@
 
     defense.build()?;
 
-    debug!("creating config");
+    debug!("creating config");
     let mcaptcha_config =
         add_mcaptcha_util(payload.duration, &payload.description, &data, &id).await?;
 
-    debug!("config created");
+    debug!("config created");
 
     for level in payload.levels.iter() {
         let difficulty_factor = level.difficulty_factor as i32;
         let visitor_threshold = level.visitor_threshold as i32;
-        sqlx::query!(
+        sqlx::query!(
             "INSERT INTO mcaptcha_levels (
             difficulty_factor, 
             visitor_threshold,
@@ -480,7 +480,7 @@
         .await?;
     }
 
-    Ok(HttpResponse::Ok().json(mcaptcha_config))
+    Ok(HttpResponse::Ok().json(mcaptcha_config))
 }
 
 #[derive(Serialize, Deserialize)]
@@ -490,17 +490,17 @@
     pub key: String,
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.levels.update",
     wrap = "crate::CheckLogin"
 )]
 async fn update_levels(
-    payload: web::Json<UpdateLevels>,
+    payload: web::Json<UpdateLevels>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
-    let mut defense = DefenseBuilder::default();
+    let mut defense = DefenseBuilder::default();
 
     for level in payload.levels.iter() {
         defense.add_level(*level)?;
@@ -511,7 +511,7 @@
     // still, needs to be benchmarked
     defense.build()?;
 
-    sqlx::query!(
+    sqlx::query!(
         "DELETE FROM mcaptcha_levels 
         WHERE config_id = (
             SELECT config_id FROM mcaptcha_config where key = ($1) 
@@ -528,7 +528,7 @@
     for level in payload.levels.iter() {
         let difficulty_factor = level.difficulty_factor as i32;
         let visitor_threshold = level.visitor_threshold as i32;
-        sqlx::query!(
+        sqlx::query!(
             "INSERT INTO mcaptcha_levels (
             difficulty_factor, 
             visitor_threshold,
@@ -548,15 +548,15 @@
         .await?;
     }
 
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.levels.delete",
     wrap = "crate::CheckLogin"
 )]
 async fn delete_levels(
-    payload: web::Json<UpdateLevels>,
+    payload: web::Json<UpdateLevels>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
@@ -564,7 +564,7 @@
 
     for level in payload.levels.iter() {
         let difficulty_factor = level.difficulty_factor as i32;
-        sqlx::query!(
+        sqlx::query!(
             "DELETE FROM mcaptcha_levels  WHERE 
             config_id = (
                 SELECT config_id FROM mcaptcha_config WHERE key = $1 AND
@@ -578,12 +578,12 @@
         .await?;
     }
 
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
-#[my_codegen::post(path = "crate::V1_API_ROUTES.levels.get", wrap = "crate::CheckLogin")]
+#[my_codegen::post(path = "crate::V1_API_ROUTES.levels.get", wrap = "crate::CheckLogin")]
 async fn get_levels(
-    payload: web::Json<MCaptchaDetails>,
+    payload: web::Json<MCaptchaDetails>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
@@ -591,7 +591,7 @@
 
     let levels = get_levels_util(&payload.key, &username, &data).await?;
 
-    Ok(HttpResponse::Ok().json(levels))
+    Ok(HttpResponse::Ok().json(levels))
 }
 
 #[derive(Clone, Debug, Deserialize, Serialize)]
@@ -610,7 +610,7 @@
     username: &str,
     data: &AppData,
 ) -> ServiceResult<Vec<I32Levels>> {
-    let levels = sqlx::query_as!(
+    let levels = sqlx::query_as!(
         I32Levels,
         "SELECT difficulty_factor, visitor_threshold FROM mcaptcha_levels  WHERE
             config_id = (
@@ -628,45 +628,45 @@
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
 
     use super::*;
-    use crate::api::v1::ROUTES;
-    use crate::data::Data;
-    use crate::tests::*;
+    use crate::api::v1::ROUTES;
+    use crate::data::Data;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn level_routes_work() {
         const NAME: &str = "testuserlevelroutes";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "testuserlevelrouts@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, signin_resp, key) = add_levels_util(NAME, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let mut app = get_app!(data).await;
 
         // 2. get level
 
-        let levels = vec![L1, L2];
+        let levels = vec![L1, L2];
 
-        let get_level_resp = test::call_service(
+        let get_level_resp = test::call_service(
             &mut app,
-            post_request!(&key, ROUTES.levels.get)
+            post_request!(&key, ROUTES.levels.get)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_level_resp.status(), StatusCode::OK);
-        let res_levels: Vec<Level> = test::read_body_json(get_level_resp).await;
-        assert_eq!(res_levels, levels);
+        assert_eq!(get_level_resp.status(), StatusCode::OK);
+        let res_levels: Vec<Level> = test::read_body_json(get_level_resp).await;
+        assert_eq!(res_levels, levels);
 
         // 3. update level
 
@@ -678,29 +678,29 @@
             difficulty_factor: 5000,
             visitor_threshold: 5000,
         };
-        let levels = vec![l1, l2];
+        let levels = vec![l1, l2];
         let add_level = UpdateLevels {
             levels: levels.clone(),
             key: key.key.clone(),
         };
-        let add_token_resp = test::call_service(
+        let add_token_resp = test::call_service(
             &mut app,
-            post_request!(&add_level, ROUTES.levels.update)
+            post_request!(&add_level, ROUTES.levels.update)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(add_token_resp.status(), StatusCode::OK);
-        let get_level_resp = test::call_service(
+        assert_eq!(add_token_resp.status(), StatusCode::OK);
+        let get_level_resp = test::call_service(
             &mut app,
-            post_request!(&key, ROUTES.levels.get)
+            post_request!(&key, ROUTES.levels.get)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_level_resp.status(), StatusCode::OK);
-        let res_levels: Vec<Level> = test::read_body_json(get_level_resp).await;
-        assert_eq!(res_levels, levels);
+        assert_eq!(get_level_resp.status(), StatusCode::OK);
+        let res_levels: Vec<Level> = test::read_body_json(get_level_resp).await;
+        assert_eq!(res_levels, levels);
 
         // 4. delete level
         let l1 = Level {
@@ -711,31 +711,31 @@
             difficulty_factor: 5000,
             visitor_threshold: 5000,
         };
-        let levels = vec![l1, l2];
+        let levels = vec![l1, l2];
         let add_level = UpdateLevels {
             levels: levels.clone(),
             key: key.key.clone(),
         };
-        let add_token_resp = test::call_service(
+        let add_token_resp = test::call_service(
             &mut app,
-            post_request!(&add_level, ROUTES.levels.delete)
+            post_request!(&add_level, ROUTES.levels.delete)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(add_token_resp.status(), StatusCode::OK);
-        let get_level_resp = test::call_service(
+        assert_eq!(add_token_resp.status(), StatusCode::OK);
+        let get_level_resp = test::call_service(
             &mut app,
-            post_request!(&key, ROUTES.levels.get)
+            post_request!(&key, ROUTES.levels.get)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_level_resp.status(), StatusCode::OK);
-        let res_levels: Vec<Level> = test::read_body_json(get_level_resp).await;
-        assert_eq!(res_levels, Vec::new());
+        assert_eq!(get_level_resp.status(), StatusCode::OK);
+        let res_levels: Vec<Level> = test::read_body_json(get_level_resp).await;
+        assert_eq!(res_levels, Vec::new());
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/mcaptcha/mod.rs.html b/src/mcaptcha/api/v1/mcaptcha/mod.rs.html index 7f9d1777..625dd14d 100644 --- a/src/mcaptcha/api/v1/mcaptcha/mod.rs.html +++ b/src/mcaptcha/api/v1/mcaptcha/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -64,24 +64,24 @@
 pub mod levels;
 
 pub fn get_random(len: usize) -> String {
-    use std::iter;
+    use std::iter;
 
-    use rand::{distributions::Alphanumeric, rngs::ThreadRng, thread_rng, Rng};
+    use rand::{distributions::Alphanumeric, rngs::ThreadRng, thread_rng, Rng};
 
     let mut rng: ThreadRng = thread_rng();
 
-    iter::repeat(())
+    iter::repeat(())
         .map(|()| rng.sample(Alphanumeric))
-        .map(char::from)
+        .map(char::from)
         .take(len)
         .collect::<String>()
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
-    duration::services(cfg);
-    levels::services(cfg);
-    captcha::services(cfg);
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+    duration::services(cfg);
+    levels::services(cfg);
+    captcha::services(cfg);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/meta.rs.html b/src/mcaptcha/api/v1/meta.rs.html index b48a2b4e..20048f20 100644 --- a/src/mcaptcha/api/v1/meta.rs.html +++ b/src/mcaptcha/api/v1/meta.rs.html @@ -1,7 +1,7 @@ -meta.rs - source +meta.rs - source -
  1
+
  1
   2
   3
   4
@@ -170,12 +170,12 @@
 */
 
 use actix_web::{web, HttpResponse, Responder};
-use derive_builder::Builder;
-use libmcaptcha::redis::{Redis, RedisConfig};
+use derive_builder::Builder;
+use libmcaptcha::redis::{Redis, RedisConfig};
 use serde::{Deserialize, Serialize};
 
-use crate::data::SystemGroup;
-use crate::AppData;
+use crate::data::SystemGroup;
+use crate::AppData;
 use crate::{GIT_COMMIT_HASH, VERSION};
 
 #[derive(Clone, Debug, Deserialize, Builder, Serialize)]
@@ -201,13 +201,13 @@
 }
 
 /// emmits build details of the bninary
-#[my_codegen::get(path = "crate::V1_API_ROUTES.meta.build_details")]
+#[my_codegen::get(path = "crate::V1_API_ROUTES.meta.build_details")]
 async fn build_details() -> impl Responder {
     let build = BuildDetails {
         version: VERSION,
         git_commit_hash: GIT_COMMIT_HASH,
     };
-    HttpResponse::Ok().json(build)
+    HttpResponse::Ok().json(build)
 }
 
 #[derive(Clone, Debug, Deserialize, Builder, Serialize)]
@@ -225,11 +225,11 @@
 }
 
 /// checks all components of the system
-#[my_codegen::get(path = "crate::V1_API_ROUTES.meta.health")]
+#[my_codegen::get(path = "crate::V1_API_ROUTES.meta.health")]
 async fn health(data: AppData) -> impl Responder {
-    use sqlx::Connection;
+    use sqlx::Connection;
 
-    let mut resp_builder = HealthBuilder::default();
+    let mut resp_builder = HealthBuilder::default();
     resp_builder.db(false);
     resp_builder.redis = None;
 
@@ -239,9 +239,9 @@
         }
     };
 
-    if let SystemGroup::Redis(_) = data.captcha {
-        if let Ok(r) = Redis::new(RedisConfig::Single(
-            crate::SETTINGS.redis.as_ref().unwrap().url.clone(),
+    if let SystemGroup::Redis(_) = data.captcha {
+        if let Ok(r) = Redis::new(RedisConfig::Single(
+            crate::SETTINGS.redis.as_ref().unwrap().url.clone(),
         ))
         .await
         {
@@ -252,56 +252,56 @@
         }
     };
 
-    HttpResponse::Ok().json(resp_builder.build().unwrap())
+    HttpResponse::Ok().json(resp_builder.build().unwrap())
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
+pub fn services(cfg: &mut web::ServiceConfig) {
     cfg.service(build_details);
     cfg.service(health);
 }
 
 #[cfg(test)]
 mod tests {
-    use actix_web::{http::StatusCode, test, App};
+    use actix_web::{http::StatusCode, test, App};
 
     use super::*;
-    use crate::api::v1::services;
+    use crate::api::v1::services;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn build_details_works() {
-        let mut app = test::init_service(App::new().configure(services)).await;
+        let mut app = test::init_service(App::new().configure(services)).await;
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(V1_API_ROUTES.meta.build_details)
                 .to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
     }
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn health_works() {
-        println!("{}", V1_API_ROUTES.meta.health);
-        let data = Data::new().await;
-        let mut app = get_app!(data).await;
+        println!("{}", V1_API_ROUTES.meta.health);
+        let data = Data::new().await;
+        let mut app = get_app!(data).await;
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(V1_API_ROUTES.meta.health)
                 .to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
 
-        let health_resp: Health = test::read_body_json(resp).await;
-        assert!(health_resp.db);
-        assert_eq!(health_resp.redis, Some(true));
+        let health_resp: Health = test::read_body_json(resp).await;
+        assert!(health_resp.db);
+        assert_eq!(health_resp.redis, Some(true));
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/mod.rs.html b/src/mcaptcha/api/v1/mod.rs.html index 5180427a..d6712e53 100644 --- a/src/mcaptcha/api/v1/mod.rs.html +++ b/src/mcaptcha/api/v1/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -59,7 +59,7 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_web::web::ServiceConfig;
+use actix_web::web::ServiceConfig;
 
 pub mod account;
 pub mod auth;
@@ -69,19 +69,19 @@
 pub mod pow;
 mod routes;
 
-pub use routes::ROUTES;
+pub use routes::ROUTES;
 
 pub fn services(cfg: &mut ServiceConfig) {
-    meta::services(cfg);
-    auth::services(cfg);
-    account::services(cfg);
-    mcaptcha::services(cfg);
-    notifications::services(cfg);
-    pow::services(cfg);
+    meta::services(cfg);
+    auth::services(cfg);
+    account::services(cfg);
+    mcaptcha::services(cfg);
+    notifications::services(cfg);
+    pow::services(cfg);
 }
 
 #[cfg(test)]
 mod tests;
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/notifications/add.rs.html b/src/mcaptcha/api/v1/notifications/add.rs.html index 0635f584..a4809281 100644 --- a/src/mcaptcha/api/v1/notifications/add.rs.html +++ b/src/mcaptcha/api/v1/notifications/add.rs.html @@ -1,7 +1,7 @@ -add.rs - source +add.rs - source -
  1
+
  1
   2
   3
   4
@@ -125,12 +125,12 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 
-use crate::errors::*;
-use crate::AppData;
+use crate::errors::*;
+use crate::AppData;
 
 #[derive(Serialize, Deserialize)]
 pub struct AddNotification {
@@ -140,18 +140,18 @@
 }
 
 /// route handler that adds a notification message
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.notifications.add",
     wrap = "crate::CheckLogin"
 )]
 pub async fn add_notification(
-    payload: web::Json<AddNotification>,
+    payload: web::Json<AddNotification>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let sender = id.identity().unwrap();
     // TODO handle error where payload.to doesnt exist
-    sqlx::query!(
+    sqlx::query!(
         "INSERT INTO mcaptcha_notifications (
               heading, message, tx, rx)
               VALUES  (
@@ -166,19 +166,19 @@
     )
     .execute(&data.db)
     .await?;
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
 
     use super::*;
-    use crate::tests::*;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn notification_works() {
         const NAME1: &str = "notifuser1";
         const NAME2: &str = "notiuser2";
@@ -187,7 +187,7 @@
         const EMAIL2: &str = "testnotification2@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME1, &data).await;
             delete_user(NAME2, &data).await;
         }
@@ -195,8 +195,8 @@
         register_and_signin(NAME1, EMAIL1, PASSWORD).await;
         register_and_signin(NAME2, EMAIL2, PASSWORD).await;
         let (data, _creds, signin_resp) = signin(NAME1, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let mut app = get_app!(data).await;
 
         let msg = AddNotification {
             to: NAME2.into(),
@@ -204,16 +204,16 @@
             message: "Testeing notifications with a dummy message".into(),
         };
 
-        let send_notification_resp = test::call_service(
+        let send_notification_resp = test::call_service(
             &mut app,
-            post_request!(&msg, V1_API_ROUTES.notifications.add)
+            post_request!(&msg, V1_API_ROUTES.notifications.add)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(send_notification_resp.status(), StatusCode::OK);
+        assert_eq!(send_notification_resp.status(), StatusCode::OK);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/notifications/get.rs.html b/src/mcaptcha/api/v1/notifications/get.rs.html index cf9a99ad..cf11277f 100644 --- a/src/mcaptcha/api/v1/notifications/get.rs.html +++ b/src/mcaptcha/api/v1/notifications/get.rs.html @@ -1,7 +1,7 @@ -get.rs - source +get.rs - source -
  1
+
  1
   2
   3
   4
@@ -170,20 +170,20 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
-use sqlx::types::time::OffsetDateTime;
+use sqlx::types::time::OffsetDateTime;
 
-use crate::errors::*;
-use crate::AppData;
+use crate::errors::*;
+use crate::AppData;
 
 pub struct Notification {
-    pub name: String,
-    pub heading: String,
-    pub message: String,
-    pub received: OffsetDateTime,
-    pub id: i32,
+    pub name: Option<String>,
+    pub heading: Option<String>,
+    pub message: Option<String>,
+    pub received: Option<OffsetDateTime>,
+    pub id: Option<i32>,
 }
 
 #[derive(Deserialize, Serialize)]
@@ -198,16 +198,16 @@
 impl From<Notification> for NotificationResp {
     fn from(n: Notification) -> Self {
         NotificationResp {
-            name: n.name,
-            heading: n.heading,
-            received: n.received.unix_timestamp(),
-            id: n.id,
-            message: n.message,
+            name: n.name.unwrap(),
+            heading: n.heading.unwrap(),
+            received: n.received.unwrap().unix_timestamp(),
+            id: n.id.unwrap(),
+            message: n.message.unwrap(),
         }
     }
 }
 /// route handler that gets all unread notifications
-#[my_codegen::get(
+#[my_codegen::get(
     path = "crate::V1_API_ROUTES.notifications.get",
     wrap = "crate::CheckLogin"
 )]
@@ -218,7 +218,7 @@
     let receiver = id.identity().unwrap();
     // TODO handle error where payload.to doesnt exist
 
-    let mut notifications = sqlx::query_file_as!(
+    let mut notifications = sqlx::query_file_as!(
         Notification,
         "src/api/v1/notifications/get_all_unread.sql",
         &receiver
@@ -234,20 +234,20 @@
         })
         .collect();
 
-    Ok(HttpResponse::Ok().json(resp))
+    Ok(HttpResponse::Ok().json(resp))
 }
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
 
     use super::*;
-    use crate::api::v1::notifications::add::AddNotification;
-    use crate::tests::*;
+    use crate::api::v1::notifications::add::AddNotification;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn notification_get_works() {
         const NAME1: &str = "notifuser12";
         const NAME2: &str = "notiuser22";
@@ -258,7 +258,7 @@
         const MESSAGE: &str = "testing notifications get message";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME1, &data).await;
             delete_user(NAME2, &data).await;
         }
@@ -267,9 +267,9 @@
         register_and_signin(NAME2, EMAIL2, PASSWORD).await;
         let (data, _creds, signin_resp) = signin(NAME1, PASSWORD).await;
         let (_data, _creds2, signin_resp2) = signin(NAME2, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let cookies2 = get_cookie!(signin_resp2);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let cookies2 = get_cookie!(signin_resp2);
+        let mut app = get_app!(data).await;
 
         let msg = AddNotification {
             to: NAME2.into(),
@@ -277,33 +277,33 @@
             message: MESSAGE.into(),
         };
 
-        let send_notification_resp = test::call_service(
+        let send_notification_resp = test::call_service(
             &mut app,
-            post_request!(&msg, V1_API_ROUTES.notifications.add)
+            post_request!(&msg, V1_API_ROUTES.notifications.add)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(send_notification_resp.status(), StatusCode::OK);
+        assert_eq!(send_notification_resp.status(), StatusCode::OK);
 
-        let get_notifications_resp = test::call_service(
+        let get_notifications_resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(V1_API_ROUTES.notifications.get)
                 .cookie(cookies2.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_notifications_resp.status(), StatusCode::OK);
+        assert_eq!(get_notifications_resp.status(), StatusCode::OK);
 
         let mut notifications: Vec<NotificationResp> =
-            test::read_body_json(get_notifications_resp).await;
+            test::read_body_json(get_notifications_resp).await;
         let notification = notifications.pop().unwrap();
-        assert_eq!(notification.name, NAME1);
-        assert_eq!(notification.message, MESSAGE);
-        assert_eq!(notification.heading, HEADING);
+        assert_eq!(notification.name, NAME1);
+        assert_eq!(notification.message, MESSAGE);
+        assert_eq!(notification.heading, HEADING);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/notifications/mark_read.rs.html b/src/mcaptcha/api/v1/notifications/mark_read.rs.html index 56054d5d..2a864113 100644 --- a/src/mcaptcha/api/v1/notifications/mark_read.rs.html +++ b/src/mcaptcha/api/v1/notifications/mark_read.rs.html @@ -1,7 +1,7 @@ -mark_read.rs - source +mark_read.rs - source -
  1
+
  1
   2
   3
   4
@@ -174,12 +174,12 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 
-use crate::errors::*;
-use crate::AppData;
+use crate::errors::*;
+use crate::AppData;
 
 #[derive(Deserialize, Serialize)]
 pub struct MarkReadReq {
@@ -196,19 +196,19 @@
 }
 
 /// route handler that marks a notification read
-#[my_codegen::post(
+#[my_codegen::post(
     path = "crate::V1_API_ROUTES.notifications.mark_read",
     wrap = "crate::CheckLogin"
 )]
 pub async fn mark_read(
     data: AppData,
-    payload: web::Json<MarkReadReq>,
+    payload: web::Json<MarkReadReq>,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let receiver = id.identity().unwrap();
     // TODO handle error where payload.to doesnt exist
 
-    sqlx::query_file_as!(
+    sqlx::query_file_as!(
         Notification,
         "src/api/v1/notifications/mark_read.sql",
         payload.id,
@@ -217,20 +217,20 @@
     .execute(&data.db)
     .await?;
 
-    Ok(HttpResponse::Ok())
+    Ok(HttpResponse::Ok())
 }
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
 
     use super::*;
-    use crate::api::v1::notifications::add::AddNotification;
-    use crate::tests::*;
+    use crate::api::v1::notifications::add::AddNotification;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn notification_mark_read_works() {
         const NAME1: &str = "notifuser122";
         const NAME2: &str = "notiuser222";
@@ -241,7 +241,7 @@
         const MESSAGE: &str = "testing notifications get message";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME1, &data).await;
             delete_user(NAME2, &data).await;
         }
@@ -250,9 +250,9 @@
         register_and_signin(NAME2, EMAIL2, PASSWORD).await;
         let (data, _creds, signin_resp) = signin(NAME1, PASSWORD).await;
         let (_data, _creds2, signin_resp2) = signin(NAME2, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let cookies2 = get_cookie!(signin_resp2);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let cookies2 = get_cookie!(signin_resp2);
+        let mut app = get_app!(data).await;
 
         let msg = AddNotification {
             to: NAME2.into(),
@@ -260,58 +260,58 @@
             message: MESSAGE.into(),
         };
 
-        let send_notification_resp = test::call_service(
+        let send_notification_resp = test::call_service(
             &mut app,
-            post_request!(&msg, V1_API_ROUTES.notifications.add)
+            post_request!(&msg, V1_API_ROUTES.notifications.add)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(send_notification_resp.status(), StatusCode::OK);
+        assert_eq!(send_notification_resp.status(), StatusCode::OK);
 
-        let get_notifications_resp = test::call_service(
+        let get_notifications_resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(V1_API_ROUTES.notifications.get)
                 .cookie(cookies2.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_notifications_resp.status(), StatusCode::OK);
+        assert_eq!(get_notifications_resp.status(), StatusCode::OK);
 
         let mut notifications: Vec<NotificationResp> =
-            test::read_body_json(get_notifications_resp).await;
+            test::read_body_json(get_notifications_resp).await;
         let notification = notifications.pop().unwrap();
-        assert_eq!(notification.name, NAME1);
-        assert_eq!(notification.message, MESSAGE);
-        assert_eq!(notification.heading, HEADING);
+        assert_eq!(notification.name, NAME1);
+        assert_eq!(notification.message, MESSAGE);
+        assert_eq!(notification.heading, HEADING);
 
         let mark_read_payload = MarkReadReq {
             id: notification.id,
         };
-        let mark_read_resp = test::call_service(
+        let mark_read_resp = test::call_service(
             &mut app,
-            post_request!(&mark_read_payload, V1_API_ROUTES.notifications.mark_read)
+            post_request!(&mark_read_payload, V1_API_ROUTES.notifications.mark_read)
                 .cookie(cookies2.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(mark_read_resp.status(), StatusCode::OK);
+        assert_eq!(mark_read_resp.status(), StatusCode::OK);
 
-        let get_notifications_resp = test::call_service(
+        let get_notifications_resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(V1_API_ROUTES.notifications.get)
                 .cookie(cookies2.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_notifications_resp.status(), StatusCode::OK);
+        assert_eq!(get_notifications_resp.status(), StatusCode::OK);
         let mut notifications: Vec<NotificationResp> =
-            test::read_body_json(get_notifications_resp).await;
-        assert!(notifications.pop().is_none());
+            test::read_body_json(get_notifications_resp).await;
+        assert!(notifications.pop().is_none());
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/notifications/mod.rs.html b/src/mcaptcha/api/v1/notifications/mod.rs.html index 9fd79949..c57563f0 100644 --- a/src/mcaptcha/api/v1/notifications/mod.rs.html +++ b/src/mcaptcha/api/v1/notifications/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -87,11 +87,11 @@
     }
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
-    cfg.service(add::add_notification);
-    cfg.service(get::get_notification);
-    cfg.service(mark_read::mark_read);
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+    cfg.service(add::add_notification);
+    cfg.service(get::get_notification);
+    cfg.service(mark_read::mark_read);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/pow/get_config.rs.html b/src/mcaptcha/api/v1/pow/get_config.rs.html index 0e02b332..d14311e4 100644 --- a/src/mcaptcha/api/v1/pow/get_config.rs.html +++ b/src/mcaptcha/api/v1/pow/get_config.rs.html @@ -1,7 +1,7 @@ -get_config.rs - source +get_config.rs - source -
  1
+
  1
   2
   3
   4
@@ -200,7 +200,6 @@
 197
 198
 199
-200
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -222,17 +221,17 @@
 //use actix::prelude::*;
 use actix_web::{web, HttpResponse, Responder};
 use libmcaptcha::{
-    defense::LevelBuilder, master::messages::AddSiteBuilder, DefenseBuilder,
+    defense::LevelBuilder, master::messages::AddSiteBuilder, DefenseBuilder,
     MCaptchaBuilder,
 };
 use serde::{Deserialize, Serialize};
 
-use super::GetDurationResp;
-use super::I32Levels;
-use crate::errors::*;
-use crate::stats::record::record_fetch;
-use crate::AppData;
-use crate::V1_API_ROUTES;
+use super::GetDurationResp;
+use super::I32Levels;
+use crate::errors::*;
+use crate::stats::record::record_fetch;
+use crate::AppData;
+use crate::V1_API_ROUTES;
 
 //#[derive(Clone, Debug, Deserialize, Serialize)]
 //pub struct PoWConfig {
@@ -248,14 +247,14 @@
 // API keys are mcaptcha actor names
 
 /// get PoW configuration for an mcaptcha key
-#[my_codegen::post(
+#[my_codegen::post(
     path = "V1_API_ROUTES.pow.get_config.strip_prefix(V1_API_ROUTES.pow.scope).unwrap()"
 )]
 pub async fn get_config(
-    payload: web::Json<GetConfigPayload>,
+    payload: web::Json<GetConfigPayload>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    let res = sqlx::query!(
+    let res = sqlx::query!(
         "SELECT EXISTS (SELECT 1 from mcaptcha_config WHERE key = $1)",
         &payload.key,
     )
@@ -263,13 +262,13 @@
     .await?;
 
     if res.exists.is_none() {
-        return Err(ServiceError::TokenNotFound);
+        return Err(ServiceError::TokenNotFound);
     }
     let payload = payload.into_inner();
     match res.exists {
         Some(true) => {
             match data.captcha.get_pow(payload.key.clone()).await {
-                Some(config) => Ok(HttpResponse::Ok().json(config)),
+                Some(config) => Ok(HttpResponse::Ok().json(config)),
                 None => {
                     init_mcaptcha(&data, &payload.key).await?;
                     let config = data
@@ -280,13 +279,13 @@
                     // background it. would require data::Data to be static
                     // to satidfy lifetime
                     record_fetch(&payload.key, &data.db).await;
-                    Ok(HttpResponse::Ok().json(config))
+                    Ok(HttpResponse::Ok().json(config))
                 }
             }
         }
 
-        Some(false) => Err(ServiceError::TokenNotFound),
-        None => Err(ServiceError::TokenNotFound),
+        Some(false) => Err(ServiceError::TokenNotFound),
+        None => Err(ServiceError::TokenNotFound),
     }
 }
 /// Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.
@@ -295,7 +294,7 @@
 /// creates [MCaptcha][libmcaptcha::MCaptcha] and adds it to [Master][libmcaptcha::Defense]
 async fn init_mcaptcha(data: &AppData, key: &str) -> ServiceResult<()> {
     // get levels
-    let levels_fut = sqlx::query_as!(
+    let levels_fut = sqlx::query_as!(
         I32Levels,
         "SELECT difficulty_factor, visitor_threshold FROM mcaptcha_levels  WHERE
             config_id = (
@@ -305,7 +304,7 @@
     )
     .fetch_all(&data.db);
     // get duration
-    let duration_fut = sqlx::query_as!(
+    let duration_fut = sqlx::query_as!(
         GetDurationResp,
         "SELECT duration FROM mcaptcha_config  
         WHERE key = $1",
@@ -313,13 +312,13 @@
     )
     .fetch_one(&data.db);
     //let (levels, duration) = futures::try_join!(levels_fut, duration_fut).await?;
-    let (levels, duration) = futures::try_join!(levels_fut, duration_fut)?;
+    let (levels, duration) = futures::try_join!(levels_fut, duration_fut)?;
 
     // build defense
-    let mut defense = DefenseBuilder::default();
+    let mut defense = DefenseBuilder::default();
 
     for level in levels.iter() {
-        let level = LevelBuilder::default()
+        let level = LevelBuilder::default()
             .visitor_threshold(level.visitor_threshold as u32)
             .difficulty_factor(level.difficulty_factor as u32)
             .unwrap()
@@ -331,7 +330,7 @@
     let defense = defense.build()?;
 
     // create captcha
-    let mcaptcha = MCaptchaBuilder::default()
+    let mcaptcha = MCaptchaBuilder::default()
         .defense(defense)
         // leaky bucket algorithm's emission interval
         .duration(duration.duration as u64)
@@ -340,14 +339,14 @@
         .unwrap();
 
     // add captcha to master
-    let msg = AddSiteBuilder::default()
+    let msg = AddSiteBuilder::default()
         .id(key.into())
         .mcaptcha(mcaptcha)
         .build()
         .unwrap();
     match &data.captcha {
-        crate::data::SystemGroup::Embedded(val) => val.master.send(msg).await.unwrap(),
-        crate::data::SystemGroup::Redis(val) => val.master.send(msg).await.unwrap(),
+        crate::data::SystemGroup::Embedded(val) => val.master.send(msg).await.unwrap(),
+        crate::data::SystemGroup::Redis(val) => val.master.send(msg).await.unwrap(),
     };
 
     Ok(())
@@ -355,18 +354,17 @@
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
-    use libmcaptcha::pow::PoWConfig;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
+    use libmcaptcha::pow::PoWConfig;
 
     use super::*;
-    use crate::tests::*;
+    use crate::tests::*;
     use crate::*;
 
     #[test]
     fn feature() {
-        actix_rt::System::new("trest")
-            .block_on(async move { get_pow_config_works().await });
+        actix_rt::System::new().block_on(async move { get_pow_config_works().await });
     }
 
     async fn get_pow_config_works() {
@@ -375,14 +373,14 @@
         const EMAIL: &str = "randomuser@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
-        let mut app = get_app!(data).await;
+        let cookies = get_cookie!(signin_resp);
+        let mut app = get_app!(data).await;
 
         let get_config_payload = GetConfigPayload {
             key: token_key.key.clone(),
@@ -390,18 +388,18 @@
 
         // update and check changes
 
-        let get_config_resp = test::call_service(
+        let get_config_resp = test::call_service(
             &mut app,
-            post_request!(&get_config_payload, V1_API_ROUTES.pow.get_config)
+            post_request!(&get_config_payload, V1_API_ROUTES.pow.get_config)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
-        assert_eq!(get_config_resp.status(), StatusCode::OK);
-        let config: PoWConfig = test::read_body_json(get_config_resp).await;
-        assert_eq!(config.difficulty_factor, L1.difficulty_factor);
+        assert_eq!(get_config_resp.status(), StatusCode::OK);
+        let config: PoWConfig = test::read_body_json(get_config_resp).await;
+        assert_eq!(config.difficulty_factor, L1.difficulty_factor);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/pow/mod.rs.html b/src/mcaptcha/api/v1/pow/mod.rs.html index c1a8d427..960b1b0c 100644 --- a/src/mcaptcha/api/v1/pow/mod.rs.html +++ b/src/mcaptcha/api/v1/pow/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -113,30 +113,30 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_web::web;
+use actix_web::web;
 use actix_web::*;
 
 pub mod get_config;
 pub mod verify_pow;
 pub mod verify_token;
 
-pub use super::mcaptcha::duration::GetDurationResp;
-pub use super::mcaptcha::levels::I32Levels;
+pub use super::mcaptcha::duration::GetDurationResp;
+pub use super::mcaptcha::levels::I32Levels;
 
-pub fn services(cfg: &mut web::ServiceConfig) {
-    let cors = actix_cors::Cors::default()
+pub fn services(cfg: &mut web::ServiceConfig) {
+    let cors = actix_cors::Cors::default()
         .allow_any_origin()
-        .allowed_methods(vec!["POST"])
+        .allowed_methods(vec!["POST"])
         .allow_any_header()
         .max_age(3600)
         .send_wildcard();
 
     cfg.service(
-        Scope::new(crate::V1_API_ROUTES.pow.scope)
+        Scope::new(crate::V1_API_ROUTES.pow.scope)
             .wrap(cors)
-            .service(verify_pow::verify_pow)
-            .service(get_config::get_config)
-            .service(verify_token::validate_captcha_token),
+            .service(verify_pow::verify_pow)
+            .service(get_config::get_config)
+            .service(verify_token::validate_captcha_token),
     );
 }
 
@@ -181,15 +181,15 @@
 
     #[test]
     fn scope_pow_works() {
-        let pow = routes::PoW::new();
-        assert_eq!(pow.get_config.strip_prefix(pow.scope).unwrap(), "config");
-        assert_eq!(pow.verify_pow.strip_prefix(pow.scope).unwrap(), "verify");
-        assert_eq!(
+        let pow = routes::PoW::new();
+        assert_eq!(pow.get_config.strip_prefix(pow.scope).unwrap(), "config");
+        assert_eq!(pow.verify_pow.strip_prefix(pow.scope).unwrap(), "verify");
+        assert_eq!(
             pow.validate_captcha_token.strip_prefix(pow.scope).unwrap(),
             "siteverify"
         );
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/pow/verify_pow.rs.html b/src/mcaptcha/api/v1/pow/verify_pow.rs.html index 84430d78..6d7a295a 100644 --- a/src/mcaptcha/api/v1/pow/verify_pow.rs.html +++ b/src/mcaptcha/api/v1/pow/verify_pow.rs.html @@ -1,7 +1,7 @@ -verify_pow.rs - source +verify_pow.rs - source -
  1
+
  1
   2
   3
   4
@@ -158,13 +158,13 @@
 //! PoW Verification module
 
 use actix_web::{web, HttpResponse, Responder};
-use libmcaptcha::pow::Work;
+use libmcaptcha::pow::Work;
 use serde::{Deserialize, Serialize};
 
-use crate::errors::*;
-use crate::stats::record::record_solve;
-use crate::AppData;
-use crate::V1_API_ROUTES;
+use crate::errors::*;
+use crate::stats::record::record_solve;
+use crate::AppData;
+use crate::V1_API_ROUTES;
 
 #[derive(Clone, Debug, Deserialize, Serialize)]
 /// validation token that clients receive as proof for submiting
@@ -177,45 +177,45 @@
 
 /// route handler that verifies PoW and issues a solution token
 /// if verification is successful
-#[my_codegen::post(
+#[my_codegen::post(
     path = "V1_API_ROUTES.pow.verify_pow.strip_prefix(V1_API_ROUTES.pow.scope).unwrap()"
 )]
 pub async fn verify_pow(
-    payload: web::Json<Work>,
+    payload: web::Json<Work>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
     let key = payload.key.clone();
     let res = data.captcha.verify_pow(payload.into_inner()).await?;
     record_solve(&key, &data.db).await;
     let payload = ValidationToken { token: res };
-    Ok(HttpResponse::Ok().json(payload))
+    Ok(HttpResponse::Ok().json(payload))
 }
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
-    use libmcaptcha::pow::PoWConfig;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
+    use libmcaptcha::pow::PoWConfig;
 
     use super::*;
-    use crate::api::v1::pow::get_config::GetConfigPayload;
-    use crate::tests::*;
+    use crate::api::v1::pow::get_config::GetConfigPayload;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn verify_pow_works() {
         const NAME: &str = "powverifyusr";
         const PASSWORD: &str = "testingpas";
         const EMAIL: &str = "verifyuser@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, _signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
-        let mut app = get_app!(data).await;
+        let mut app = get_app!(data).await;
 
         let get_config_payload = GetConfigPayload {
             key: token_key.key.clone(),
@@ -223,16 +223,16 @@
 
         // update and check changes
 
-        let get_config_resp = test::call_service(
+        let get_config_resp = test::call_service(
             &mut app,
-            post_request!(&get_config_payload, V1_API_ROUTES.pow.get_config)
+            post_request!(&get_config_payload, V1_API_ROUTES.pow.get_config)
                 .to_request(),
         )
         .await;
-        assert_eq!(get_config_resp.status(), StatusCode::OK);
-        let config: PoWConfig = test::read_body_json(get_config_resp).await;
+        assert_eq!(get_config_resp.status(), StatusCode::OK);
+        let config: PoWConfig = test::read_body_json(get_config_resp).await;
 
-        let pow = pow_sha256::ConfigBuilder::default()
+        let pow = pow_sha256::ConfigBuilder::default()
             .salt(config.salt)
             .build()
             .unwrap();
@@ -247,21 +247,21 @@
             key: token_key.key.clone(),
         };
 
-        let pow_verify_resp = test::call_service(
+        let pow_verify_resp = test::call_service(
             &mut app,
-            post_request!(&work, V1_API_ROUTES.pow.verify_pow).to_request(),
+            post_request!(&work, V1_API_ROUTES.pow.verify_pow).to_request(),
         )
         .await;
-        assert_eq!(pow_verify_resp.status(), StatusCode::OK);
+        assert_eq!(pow_verify_resp.status(), StatusCode::OK);
 
-        let string_not_found = test::call_service(
+        let string_not_found = test::call_service(
             &mut app,
-            post_request!(&work, V1_API_ROUTES.pow.verify_pow).to_request(),
+            post_request!(&work, V1_API_ROUTES.pow.verify_pow).to_request(),
         )
         .await;
-        assert_eq!(string_not_found.status(), StatusCode::BAD_REQUEST);
-        let err: ErrorToResponse = test::read_body_json(string_not_found).await;
-        assert_eq!(err.error, "Challenge: not found");
+        assert_eq!(string_not_found.status(), StatusCode::BAD_REQUEST);
+        let err: ErrorToResponse = test::read_body_json(string_not_found).await;
+        assert_eq!(err.error, "Challenge: not found");
 
         // let pow_config_resp = test::call_service(
         //     &mut app,
@@ -277,5 +277,5 @@
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/pow/verify_token.rs.html b/src/mcaptcha/api/v1/pow/verify_token.rs.html index e7682ef2..69f1bc9e 100644 --- a/src/mcaptcha/api/v1/pow/verify_token.rs.html +++ b/src/mcaptcha/api/v1/pow/verify_token.rs.html @@ -1,7 +1,7 @@ -verify_token.rs - source +verify_token.rs - source -
  1
+
  1
   2
   3
   4
@@ -182,13 +182,13 @@
 //! PoW success token module
 
 use actix_web::{web, HttpResponse, Responder};
-use libmcaptcha::cache::messages::VerifyCaptchaResult;
+use libmcaptcha::cache::messages::VerifyCaptchaResult;
 use serde::{Deserialize, Serialize};
 
-use crate::errors::*;
-use crate::stats::record::record_confirm;
-use crate::AppData;
-use crate::V1_API_ROUTES;
+use crate::errors::*;
+use crate::stats::record::record_confirm;
+use crate::AppData;
+use crate::V1_API_ROUTES;
 
 #[derive(Clone, Debug, Deserialize, Serialize)]
 pub struct CaptchaValidateResp {
@@ -198,11 +198,11 @@
 // API keys are mcaptcha actor names
 
 /// route hander that validates a PoW solution token
-#[my_codegen::post(
+#[my_codegen::post(
     path = "V1_API_ROUTES.pow.validate_captcha_token.strip_prefix(V1_API_ROUTES.pow.scope).unwrap()"
 )]
 pub async fn validate_captcha_token(
-    payload: web::Json<VerifyCaptchaResult>,
+    payload: web::Json<VerifyCaptchaResult>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
     let key = payload.key.clone();
@@ -213,23 +213,23 @@
     let payload = CaptchaValidateResp { valid: res };
     record_confirm(&key, &data.db).await;
     //println!("{:?}", &payload);
-    Ok(HttpResponse::Ok().json(payload))
+    Ok(HttpResponse::Ok().json(payload))
 }
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::{header, StatusCode};
-    use actix_web::test;
-    use libmcaptcha::pow::PoWConfig;
-    use libmcaptcha::pow::Work;
+    use actix_web::http::{header, StatusCode};
+    use actix_web::test;
+    use libmcaptcha::pow::PoWConfig;
+    use libmcaptcha::pow::Work;
 
     use super::*;
-    use crate::api::v1::pow::get_config::GetConfigPayload;
-    use crate::api::v1::pow::verify_pow::ValidationToken;
-    use crate::tests::*;
+    use crate::api::v1::pow::get_config::GetConfigPayload;
+    use crate::api::v1::pow::verify_pow::ValidationToken;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn validate_captcha_token_works() {
         const NAME: &str = "enterprisetken";
         const PASSWORD: &str = "testingpas";
@@ -240,13 +240,13 @@
         //        const UPDATE_URL: &str = "/api/v1/mcaptcha/domain/token/duration/update";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, _signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
-        let mut app = get_app!(data).await;
+        let mut app = get_app!(data).await;
 
         let get_config_payload = GetConfigPayload {
             key: token_key.key.clone(),
@@ -254,15 +254,15 @@
 
         // update and check changes
 
-        let get_config_resp = test::call_service(
+        let get_config_resp = test::call_service(
             &mut app,
-            post_request!(&get_config_payload, GET_URL).to_request(),
+            post_request!(&get_config_payload, GET_URL).to_request(),
         )
         .await;
-        assert_eq!(get_config_resp.status(), StatusCode::OK);
-        let config: PoWConfig = test::read_body_json(get_config_resp).await;
+        assert_eq!(get_config_resp.status(), StatusCode::OK);
+        let config: PoWConfig = test::read_body_json(get_config_resp).await;
 
-        let pow = pow_sha256::ConfigBuilder::default()
+        let pow = pow_sha256::ConfigBuilder::default()
             .salt(config.salt)
             .build()
             .unwrap();
@@ -277,37 +277,37 @@
             key: token_key.key.clone(),
         };
 
-        let pow_verify_resp = test::call_service(
+        let pow_verify_resp = test::call_service(
             &mut app,
-            post_request!(&work, VERIFY_CAPTCHA_URL).to_request(),
+            post_request!(&work, VERIFY_CAPTCHA_URL).to_request(),
         )
         .await;
-        assert_eq!(pow_verify_resp.status(), StatusCode::OK);
-        let client_token: ValidationToken = test::read_body_json(pow_verify_resp).await;
+        assert_eq!(pow_verify_resp.status(), StatusCode::OK);
+        let client_token: ValidationToken = test::read_body_json(pow_verify_resp).await;
 
         let validate_payload = VerifyCaptchaResult {
             token: client_token.token.clone(),
             key: token_key.key.clone(),
         };
 
-        let validate_client_token = test::call_service(
+        let validate_client_token = test::call_service(
             &mut app,
-            post_request!(&validate_payload, VERIFY_TOKEN_URL).to_request(),
+            post_request!(&validate_payload, VERIFY_TOKEN_URL).to_request(),
         )
         .await;
-        assert_eq!(validate_client_token.status(), StatusCode::OK);
+        assert_eq!(validate_client_token.status(), StatusCode::OK);
         let resp: CaptchaValidateResp =
-            test::read_body_json(validate_client_token).await;
-        assert!(resp.valid);
+            test::read_body_json(validate_client_token).await;
+        assert!(resp.valid);
 
         // string not found
-        let string_not_found = test::call_service(
+        let string_not_found = test::call_service(
             &mut app,
-            post_request!(&validate_payload, VERIFY_TOKEN_URL).to_request(),
+            post_request!(&validate_payload, VERIFY_TOKEN_URL).to_request(),
         )
         .await;
-        let resp: CaptchaValidateResp = test::read_body_json(string_not_found).await;
-        assert!(!resp.valid);
+        let resp: CaptchaValidateResp = test::read_body_json(string_not_found).await;
+        assert!(!resp.valid);
 
         let validate_payload = VerifyCaptchaResult {
             token: client_token.token.clone(),
@@ -315,15 +315,15 @@
         };
 
         // key not found
-        let key_not_found = test::call_service(
+        let key_not_found = test::call_service(
             &mut app,
-            post_request!(&validate_payload, VERIFY_TOKEN_URL).to_request(),
+            post_request!(&validate_payload, VERIFY_TOKEN_URL).to_request(),
         )
         .await;
-        let resp: CaptchaValidateResp = test::read_body_json(key_not_found).await;
-        assert!(!resp.valid);
+        let resp: CaptchaValidateResp = test::read_body_json(key_not_found).await;
+        assert!(!resp.valid);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/api/v1/routes.rs.html b/src/mcaptcha/api/v1/routes.rs.html index ac539c5f..21f71b58 100644 --- a/src/mcaptcha/api/v1/routes.rs.html +++ b/src/mcaptcha/api/v1/routes.rs.html @@ -1,7 +1,7 @@ -routes.rs - source +routes.rs - source -
 1
+
 1
  2
  3
  4
@@ -72,16 +72,16 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use super::account::routes::Account;
-use super::auth::routes::Auth;
-use super::mcaptcha::captcha::routes::MCaptcha;
-use super::mcaptcha::duration::routes::Duration;
-use super::mcaptcha::levels::routes::Levels;
-use super::meta::routes::Meta;
-use super::notifications::routes::Notifications;
-use super::pow::routes::PoW;
+use super::account::routes::Account;
+use super::auth::routes::Auth;
+use super::mcaptcha::captcha::routes::MCaptcha;
+use super::mcaptcha::duration::routes::Duration;
+use super::mcaptcha::levels::routes::Levels;
+use super::meta::routes::Meta;
+use super::notifications::routes::Notifications;
+use super::pow::routes::PoW;
 
-pub const ROUTES: Routes = Routes::new();
+pub const ROUTES: Routes = Routes::new();
 
 pub struct Routes {
     pub auth: Auth,
@@ -97,17 +97,17 @@
 impl Routes {
     const fn new() -> Routes {
         Routes {
-            auth: Auth::new(),
-            account: Account::new(),
-            levels: Levels::new(),
-            mcaptcha: MCaptcha::new(),
-            duration: Duration::new(),
-            meta: Meta::new(),
-            pow: PoW::new(),
-            notifications: Notifications::new(),
+            auth: Auth::new(),
+            account: Account::new(),
+            levels: Levels::new(),
+            mcaptcha: MCaptcha::new(),
+            duration: Duration::new(),
+            meta: Meta::new(),
+            pow: PoW::new(),
+            notifications: Notifications::new(),
         }
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/data.rs.html b/src/mcaptcha/data.rs.html index f45d5659..b6d6781e 100644 --- a/src/mcaptcha/data.rs.html +++ b/src/mcaptcha/data.rs.html @@ -1,7 +1,7 @@ -data.rs - source +data.rs - source -
  1
+
  1
   2
   3
   4
@@ -193,6 +193,18 @@
 190
 191
 192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -211,33 +223,34 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 //! App data: redis cache, database connections, etc.
-use std::sync::Arc;
+use std::sync::Arc;
 
-use actix::prelude::*;
+use actix::prelude::*;
 use argon2_creds::{Config, ConfigBuilder, PasswordPolicy};
+use lettre::transport::smtp::authentication::Mechanism;
 use lettre::{
-    transport::smtp::authentication::Credentials, AsyncSmtpTransport, Tokio1Executor,
+    transport::smtp::authentication::Credentials, AsyncSmtpTransport, Tokio1Executor,
 };
-use libmcaptcha::cache::hashcache::HashCache;
-use libmcaptcha::cache::redis::RedisCache;
-use libmcaptcha::master::redis::master::Master as RedisMaster;
-use libmcaptcha::redis::RedisConfig;
+use libmcaptcha::cache::hashcache::HashCache;
+use libmcaptcha::cache::redis::RedisCache;
+use libmcaptcha::master::redis::master::Master as RedisMaster;
+use libmcaptcha::redis::RedisConfig;
 use libmcaptcha::{
-    cache::messages::VerifyCaptchaResult,
-    cache::Save,
-    errors::CaptchaResult,
-    master::{embedded::master::Master as EmbeddedMaster, Master as MasterTrait},
-    pow::ConfigBuilder as PoWConfigBuilder,
-    pow::PoWConfig,
-    pow::Work,
+    cache::messages::VerifyCaptchaResult,
+    cache::Save,
+    errors::CaptchaResult,
+    master::{embedded::master::Master as EmbeddedMaster, Master as MasterTrait},
+    pow::ConfigBuilder as PoWConfigBuilder,
+    pow::PoWConfig,
+    pow::Work,
     system::{System, SystemBuilder},
     //    master::messages::AddSite,
 };
 
-use sqlx::postgres::PgPoolOptions;
-use sqlx::PgPool;
+use sqlx::postgres::PgPoolOptions;
+use sqlx::PgPool;
 
-use crate::SETTINGS;
+use crate::SETTINGS;
 
 /// Represents mCaptcha cache and master system.
 /// When Redis is configured, [SystemGroup::Redis] is used and
@@ -251,16 +264,16 @@
     /// utility function to get difficulty factor of site `id` and cache it
     pub async fn get_pow(&self, id: String) -> Option<PoWConfig> {
         match self {
-            Self::Embedded(val) => val.get_pow(id).await,
-            Self::Redis(val) => val.get_pow(id).await,
+            Self::Embedded(val) => val.get_pow(id).await,
+            Self::Redis(val) => val.get_pow(id).await,
         }
     }
 
     /// utility function to verify [Work]
     pub async fn verify_pow(&self, work: Work) -> CaptchaResult<String> {
         match self {
-            Self::Embedded(val) => val.verify_pow(work).await,
-            Self::Redis(val) => val.verify_pow(work).await,
+            Self::Embedded(val) => val.verify_pow(work).await,
+            Self::Redis(val) => val.verify_pow(work).await,
         }
     }
 
@@ -270,8 +283,8 @@
         msg: VerifyCaptchaResult,
     ) -> CaptchaResult<bool> {
         match self {
-            Self::Embedded(val) => val.validate_verification_tokens(msg).await,
-            Self::Redis(val) => val.validate_verification_tokens(msg).await,
+            Self::Embedded(val) => val.validate_verification_tokens(msg).await,
+            Self::Redis(val) => val.validate_verification_tokens(msg).await,
         }
     }
 
@@ -288,12 +301,12 @@
     //        }
 
     fn new_system<A: Save, B: MasterTrait>(m: Addr<B>, c: Addr<A>) -> System<A, B> {
-        let pow = PoWConfigBuilder::default()
+        let pow = PoWConfigBuilder::default()
             .salt(SETTINGS.pow.salt.clone())
             .build()
             .unwrap();
 
-        SystemBuilder::default().pow(pow).cache(c).master(m).build()
+        SystemBuilder::default().pow(pow).cache(c).master(m).build()
     }
 
     // read settings, if Redis is configured then produce a Redis mCaptcha cache
@@ -301,24 +314,24 @@
     async fn new() -> Self {
         match &SETTINGS.redis {
             Some(val) => {
-                let master = RedisMaster::new(RedisConfig::Single(val.url.clone()))
+                let master = RedisMaster::new(RedisConfig::Single(val.url.clone()))
                     .await
                     .unwrap()
                     .start();
-                let cache = RedisCache::new(RedisConfig::Single(val.url.clone()))
+                let cache = RedisCache::new(RedisConfig::Single(val.url.clone()))
                     .await
                     .unwrap()
                     .start();
-                let captcha = Self::new_system(master, cache);
+                let captcha = Self::new_system(master, cache);
 
-                SystemGroup::Redis(captcha)
+                SystemGroup::Redis(captcha)
             }
             None => {
-                let master = EmbeddedMaster::new(SETTINGS.pow.gc).start();
-                let cache = HashCache::default().start();
-                let captcha = Self::new_system(master, cache);
+                let master = EmbeddedMaster::new(SETTINGS.pow.gc).start();
+                let cache = HashCache::default().start();
+                let captcha = Self::new_system(master, cache);
 
-                SystemGroup::Embedded(captcha)
+                SystemGroup::Embedded(captcha)
             }
         }
     }
@@ -340,43 +353,54 @@
     #[cfg(not(tarpaulin_include))]
     /// create new instance of app data
     pub async fn new() -> Arc<Self> {
-        let db = PgPoolOptions::new()
+        let db = PgPoolOptions::new()
             .max_connections(SETTINGS.database.pool)
             .connect(&SETTINGS.database.url)
             .await
             .expect("Unable to form database pool");
 
-        let creds = ConfigBuilder::default()
+        let creds = ConfigBuilder::default()
             .username_case_mapped(true)
             .profanity(true)
             .blacklist(true)
-            .password_policy(PasswordPolicy::default())
+            .password_policy(PasswordPolicy::default())
             .build()
             .unwrap();
 
-        log::info!("Initializing credential manager");
-        creds.init();
-        log::info!("Initialized credential manager");
+        log::info!("Initializing credential manager");
+        //creds.init();
+        log::info!("Initialized credential manager");
 
         let data = Data {
             creds,
             db,
-            captcha: SystemGroup::new().await,
-            mailer: Self::get_mailer(),
+            captcha: SystemGroup::new().await,
+            mailer: Self::get_mailer(),
         };
 
-        Arc::new(data)
+        Arc::new(data)
     }
 
     fn get_mailer() -> Option<Mailer> {
         if let Some(smtp) = SETTINGS.smtp.as_ref() {
             let creds =
-                Credentials::new(smtp.username.to_string(), smtp.password.to_string()); // "smtp_username".to_string(), "smtp_password".to_string());
+                Credentials::new(smtp.username.to_string(), smtp.password.to_string()); // "smtp_username".to_string(), "smtp_password".to_string());
 
-            let mailer: Mailer = AsyncSmtpTransport::<Tokio1Executor>::relay(&smtp.url) //"smtp.gmail.com")
-                .unwrap()
-                .credentials(creds)
-                .build();
+            let mailer: Mailer =
+                AsyncSmtpTransport::<Tokio1Executor>::builder_dangerous(&smtp.url)
+                    .port(smtp.port)
+                    .credentials(creds)
+                    .authentication(vec![
+                        Mechanism::Login,
+                        Mechanism::Xoauth2,
+                        Mechanism::Plain,
+                    ])
+                    .build();
+
+            //            let mailer: Mailer = AsyncSmtpTransport::<Tokio1Executor>::relay(&smtp.url) //"smtp.gmail.com")
+            //                .unwrap()
+            //                .credentials(creds)
+            //                .build();
             Some(mailer)
         } else {
             None
@@ -387,5 +411,5 @@
 /// Mailer data type AsyncSmtpTransport<Tokio1Executor>
 pub type Mailer = AsyncSmtpTransport<Tokio1Executor>;
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/docs.rs.html b/src/mcaptcha/docs.rs.html index ed4766f7..a92a3d3b 100644 --- a/src/mcaptcha/docs.rs.html +++ b/src/mcaptcha/docs.rs.html @@ -1,7 +1,7 @@ -docs.rs - source +docs.rs - source -
  1
+
  1
   2
   3
   4
@@ -151,16 +151,16 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::borrow::Cow;
+use std::borrow::Cow;
 
-use actix_web::body::Body;
-use actix_web::{http::header, web, HttpResponse, Responder};
-use mime_guess::from_path;
-use rust_embed::RustEmbed;
+use actix_web::body::Body;
+use actix_web::{http::header, web, HttpResponse, Responder};
+use mime_guess::from_path;
+use rust_embed::RustEmbed;
 
-use crate::CACHE_AGE;
+use crate::CACHE_AGE;
 
-pub const DOCS: routes::Docs = routes::Docs::new();
+pub const DOCS: routes::Docs = routes::Docs::new();
 
 pub mod routes {
     pub struct Docs {
@@ -180,11 +180,11 @@
     }
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
-    use crate::define_resource;
-    define_resource!(cfg, &DOCS.home[0..DOCS.home.len() - 1], Methods::Get, index);
-    define_resource!(cfg, DOCS.spec, Methods::Get, spec);
-    define_resource!(cfg, DOCS.assets, Methods::Get, dist);
+pub fn services(cfg: &mut web::ServiceConfig) {
+    use crate::define_resource;
+    define_resource!(cfg, &DOCS.home[0..DOCS.home.len() - 1], Methods::Get, index);
+    define_resource!(cfg, DOCS.spec, Methods::Get, spec);
+    define_resource!(cfg, DOCS.assets, Methods::Get, dist);
 }
 
 #[derive(RustEmbed)]
@@ -192,31 +192,31 @@
 struct Asset;
 
 pub fn handle_embedded_file(path: &str) -> HttpResponse {
-    match Asset::get(path) {
+    match Asset::get(path) {
         Some(content) => {
             let body: Body = match content {
-                Cow::Borrowed(bytes) => bytes.into(),
-                Cow::Owned(bytes) => bytes.into(),
+                Cow::Borrowed(bytes) => bytes.into(),
+                Cow::Owned(bytes) => bytes.into(),
             };
-            HttpResponse::Ok()
-                .set(header::CacheControl(vec![header::CacheDirective::MaxAge(
-                    CACHE_AGE,
-                )]))
+            HttpResponse::Ok()
+                .insert_header(header::CacheControl(vec![
+                    header::CacheDirective::MaxAge(CACHE_AGE),
+                ]))
                 .content_type(from_path(path).first_or_octet_stream().as_ref())
                 .body(body)
         }
-        None => HttpResponse::NotFound().body("404 Not Found"),
+        None => HttpResponse::NotFound().body("404 Not Found"),
     }
 }
 
-async fn dist(path: web::Path<String>) -> impl Responder {
-    handle_embedded_file(&path.0)
+async fn dist(path: web::Path<String>) -> impl Responder {
+    handle_embedded_file(&path)
 }
 
 async fn spec() -> HttpResponse {
-    HttpResponse::Ok()
+    HttpResponse::Ok()
         .content_type("appilcation/json")
-        .body(&*crate::OPEN_API_DOC)
+        .body(&*crate::OPEN_API_DOC)
 }
 
 async fn index() -> HttpResponse {
@@ -225,49 +225,49 @@
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::StatusCode;
-    use actix_web::test;
+    use actix_web::http::StatusCode;
+    use actix_web::test;
 
     use super::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn docs_works() {
         const FILE: &str = "favicon-32x32.png";
 
-        let mut app = test::init_service(
-            App::new()
-                .wrap(actix_middleware::NormalizePath::new(
-                    actix_middleware::normalize::TrailingSlash::Trim,
+        let mut app = test::init_service(
+            App::new()
+                .wrap(actix_middleware::NormalizePath::new(
+                    actix_middleware::TrailingSlash::Trim,
                 ))
                 .configure(services),
         )
         .await;
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get().uri(DOCS.home).to_request(),
+            test::TestRequest::get().uri(DOCS.home).to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get().uri(DOCS.spec).to_request(),
+            test::TestRequest::get().uri(DOCS.spec).to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
 
-        let uri = format!("{}{}", DOCS.home, FILE);
+        let uri = format!("{}{}", DOCS.home, FILE);
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get().uri(&uri).to_request(),
+            test::TestRequest::get().uri(&uri).to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/email/mod.rs.html b/src/mcaptcha/email/mod.rs.html new file mode 100644 index 00000000..b391533e --- /dev/null +++ b/src/mcaptcha/email/mod.rs.html @@ -0,0 +1,43 @@ +mod.rs - source + +
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+
+/*
+* Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Affero General Public License as
+* published by the Free Software Foundation, either version 3 of the
+* License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU Affero General Public License for more details.
+*
+* You should have received a copy of the GNU Affero General Public License
+* along with this program.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+pub mod verification;
+
+
+ \ No newline at end of file diff --git a/src/mcaptcha/email/verification.rs.html b/src/mcaptcha/email/verification.rs.html new file mode 100644 index 00000000..31b58607 --- /dev/null +++ b/src/mcaptcha/email/verification.rs.html @@ -0,0 +1,231 @@ +verification.rs - source + +
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+
+/*
+* Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Affero General Public License as
+* published by the Free Software Foundation, either version 3 of the
+* License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU Affero General Public License for more details.
+*
+* You should have received a copy of the GNU Affero General Public License
+* along with this program.  If not, see <https://www.gnu.org/licenses/>.
+*/
+//! Email operations: verification, notification, etc
+use lettre::{
+    message::{header, MultiPart, SinglePart},
+    AsyncTransport, Message,
+};
+use sailfish::TemplateOnce;
+
+use crate::errors::*;
+use crate::Data;
+use crate::SETTINGS;
+
+const PAGE: &str = "Login";
+
+#[derive(Clone, TemplateOnce)]
+#[template(path = "email/verification/index.html")]
+struct IndexPage<'a> {
+    verification_link: &'a str,
+}
+
+impl<'a> IndexPage<'a> {
+    fn new(verification_link: &'a str) -> Self {
+        Self { verification_link }
+    }
+}
+
+async fn verification(
+    data: &Data,
+    to: &str,
+    verification_link: &str,
+) -> ServiceResult<()> {
+    if let Some(smtp) = SETTINGS.smtp.as_ref() {
+        let from = format!("mCaptcha Admin <{}>", smtp.from);
+        let reply_to = format!("mCaptcha Admin <{}>", smtp.reply_to);
+        const SUBJECT: &str = "[mCaptcha] Please verify your email";
+
+        let plain_text = format!(
+            "
+Welcome to mCaptcha!
+
+Please verify your email address to continue.
+
+VERIFICATION LINK: {}
+
+Please ignore this email if you weren't expecting it.
+
+With best regards,
+Admin
+instance: {}
+project website: {}",
+            verification_link,
+            SETTINGS.server.domain,
+            crate::PKG_HOMEPAGE
+        );
+
+        let html = IndexPage::new(verification_link).render_once().unwrap();
+
+        let email = Message::builder()
+            .from(from.parse().unwrap())
+            .reply_to(reply_to.parse().unwrap())
+            .to(to.parse().unwrap())
+            .subject(SUBJECT)
+            .multipart(
+                MultiPart::alternative() // This is composed of two parts.
+                    .singlepart(
+                        SinglePart::builder()
+                            .header(header::ContentType::TEXT_PLAIN)
+                            .body(plain_text), // Every message should have a plain text fallback.
+                    )
+                    .singlepart(
+                        SinglePart::builder()
+                            .header(header::ContentType::TEXT_HTML)
+                            .body(html),
+                    ),
+            )
+            .unwrap();
+
+        // unwrap is OK as SETTINGS.smtp is check at the start
+        data.mailer.as_ref().unwrap().send(email).await?;
+    }
+    Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[actix_rt::test]
+    async fn email_verification_works() {
+        const TO_ADDR: &str = "Hello <realaravinth@localhost>";
+        const VERIFICATION_LINK: &str = "https://localhost";
+        let data = Data::new().await;
+        verification(&data, TO_ADDR, VERIFICATION_LINK)
+            .await
+            .unwrap();
+    }
+}
+
+
+ \ No newline at end of file diff --git a/src/mcaptcha/errors.rs.html b/src/mcaptcha/errors.rs.html index 2f3cbe5b..476c6144 100644 --- a/src/mcaptcha/errors.rs.html +++ b/src/mcaptcha/errors.rs.html @@ -1,7 +1,7 @@ -errors.rs - source +errors.rs - source -
  1
+
  1
   2
   3
   4
@@ -262,6 +262,40 @@
 259
 260
 261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -280,20 +314,30 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use std::convert::From;
+use std::convert::From;
 
 use actix_web::{
-    dev::HttpResponseBuilder,
-    error::ResponseError,
+    dev::BaseHttpResponseBuilder as HttpResponseBuilder,
+    error::ResponseError,
     http::{header, StatusCode},
     HttpResponse,
 };
-use argon2_creds::errors::CredsError;
+use argon2_creds::errors::CredsError;
 use derive_more::{Display, Error};
-use libmcaptcha::errors::CaptchaError;
+use lettre::transport::smtp::Error as SmtpError;
+use libmcaptcha::errors::CaptchaError;
 use serde::{Deserialize, Serialize};
-use url::ParseError;
-use validator::ValidationErrors;
+use url::ParseError;
+use validator::ValidationErrors;
+
+#[derive(Debug, Display, Error)]
+pub struct SmtpErrorWrapper(SmtpError);
+
+impl std::cmp::PartialEq for SmtpErrorWrapper {
+    fn eq(&self, other: &Self) -> bool {
+        self.0.status() == other.0.status()
+    }
+}
 
 #[derive(Debug, Display, PartialEq, Error)]
 #[cfg(not(tarpaulin_include))]
@@ -346,6 +390,10 @@
     #[display(fmt = "Email not available")]
     EmailTaken,
 
+    /// Unable to send email
+    #[display(fmt = "Unable to send email, contact admin")]
+    UnableToSendEmail(SmtpErrorWrapper),
+
     /// when the a token name is already taken
     /// token not found
     #[display(fmt = "Token not found. Is token registered?")]
@@ -365,40 +413,52 @@
 impl ResponseError for ServiceError {
     #[cfg(not(tarpaulin_include))]
     fn error_response(&self) -> HttpResponse {
-        HttpResponseBuilder::new(self.status_code())
-            .set_header(header::CONTENT_TYPE, "application/json; charset=UTF-8")
-            .json(ErrorToResponse {
-                error: self.to_string(),
-            })
+        HttpResponseBuilder::new(self.status_code())
+            .append_header((header::CONTENT_TYPE, "application/json; charset=UTF-8"))
+            .body(
+                serde_json::to_string(&ErrorToResponse {
+                    error: self.to_string(),
+                })
+                .unwrap(),
+            )
+            .into()
     }
 
     #[cfg(not(tarpaulin_include))]
     fn status_code(&self) -> StatusCode {
         match self {
-            ServiceError::ClosedForRegistration => StatusCode::FORBIDDEN,
-            ServiceError::InternalServerError => StatusCode::INTERNAL_SERVER_ERROR,
-            ServiceError::NotAnEmail => StatusCode::BAD_REQUEST,
-            ServiceError::NotAUrl => StatusCode::BAD_REQUEST,
-            ServiceError::WrongPassword => StatusCode::UNAUTHORIZED,
-            ServiceError::UsernameNotFound => StatusCode::NOT_FOUND,
-            ServiceError::AccountNotFound => StatusCode::NOT_FOUND,
+            ServiceError::ClosedForRegistration => StatusCode::FORBIDDEN,
+            ServiceError::InternalServerError => StatusCode::INTERNAL_SERVER_ERROR,
+            ServiceError::NotAnEmail => StatusCode::BAD_REQUEST,
+            ServiceError::NotAUrl => StatusCode::BAD_REQUEST,
+            ServiceError::WrongPassword => StatusCode::UNAUTHORIZED,
+            ServiceError::UsernameNotFound => StatusCode::NOT_FOUND,
+            ServiceError::AccountNotFound => StatusCode::NOT_FOUND,
 
-            ServiceError::ProfainityError => StatusCode::BAD_REQUEST,
-            ServiceError::BlacklistError => StatusCode::BAD_REQUEST,
-            ServiceError::UsernameCaseMappedError => StatusCode::BAD_REQUEST,
+            ServiceError::ProfainityError => StatusCode::BAD_REQUEST,
+            ServiceError::BlacklistError => StatusCode::BAD_REQUEST,
+            ServiceError::UsernameCaseMappedError => StatusCode::BAD_REQUEST,
 
-            ServiceError::PasswordTooShort => StatusCode::BAD_REQUEST,
-            ServiceError::PasswordTooLong => StatusCode::BAD_REQUEST,
-            ServiceError::PasswordsDontMatch => StatusCode::BAD_REQUEST,
+            ServiceError::PasswordTooShort => StatusCode::BAD_REQUEST,
+            ServiceError::PasswordTooLong => StatusCode::BAD_REQUEST,
+            ServiceError::PasswordsDontMatch => StatusCode::BAD_REQUEST,
 
-            ServiceError::UsernameTaken => StatusCode::BAD_REQUEST,
-            ServiceError::EmailTaken => StatusCode::BAD_REQUEST,
+            ServiceError::UsernameTaken => StatusCode::BAD_REQUEST,
+            ServiceError::EmailTaken => StatusCode::BAD_REQUEST,
 
-            ServiceError::TokenNotFound => StatusCode::NOT_FOUND,
-            ServiceError::CaptchaError(e) => match e {
-                CaptchaError::MailboxError => StatusCode::INTERNAL_SERVER_ERROR,
-                _ => StatusCode::BAD_REQUEST,
-            },
+            ServiceError::TokenNotFound => StatusCode::NOT_FOUND,
+            ServiceError::CaptchaError(e) => {
+                log::error!("{}", e);
+                match e {
+                    CaptchaError::MailboxError => StatusCode::INTERNAL_SERVER_ERROR,
+                    _ => StatusCode::BAD_REQUEST,
+                }
+            }
+
+            ServiceError::UnableToSendEmail(e) => {
+                log::error!("{}", e.0);
+                StatusCode::INTERNAL_SERVER_ERROR
+            }
         }
     }
 }
@@ -407,13 +467,13 @@
     #[cfg(not(tarpaulin_include))]
     fn from(e: CredsError) -> ServiceError {
         match e {
-            CredsError::UsernameCaseMappedError => ServiceError::UsernameCaseMappedError,
-            CredsError::ProfainityError => ServiceError::ProfainityError,
-            CredsError::BlacklistError => ServiceError::BlacklistError,
-            CredsError::NotAnEmail => ServiceError::NotAnEmail,
-            CredsError::Argon2Error(_) => ServiceError::InternalServerError,
-            CredsError::PasswordTooLong => ServiceError::PasswordTooLong,
-            CredsError::PasswordTooShort => ServiceError::PasswordTooShort,
+            CredsError::UsernameCaseMappedError => ServiceError::UsernameCaseMappedError,
+            CredsError::ProfainityError => ServiceError::ProfainityError,
+            CredsError::BlacklistError => ServiceError::BlacklistError,
+            CredsError::NotAnEmail => ServiceError::NotAnEmail,
+            CredsError::Argon2Error(_) => ServiceError::InternalServerError,
+            CredsError::PasswordTooLong => ServiceError::PasswordTooLong,
+            CredsError::PasswordTooShort => ServiceError::PasswordTooShort,
         }
     }
 }
@@ -421,41 +481,49 @@
 impl From<ValidationErrors> for ServiceError {
     #[cfg(not(tarpaulin_include))]
     fn from(_: ValidationErrors) -> ServiceError {
-        ServiceError::NotAnEmail
+        ServiceError::NotAnEmail
     }
 }
 
 impl From<ParseError> for ServiceError {
     #[cfg(not(tarpaulin_include))]
     fn from(_: ParseError) -> ServiceError {
-        ServiceError::NotAUrl
+        ServiceError::NotAUrl
     }
 }
 
 #[cfg(not(tarpaulin_include))]
 impl From<CaptchaError> for ServiceError {
     fn from(e: CaptchaError) -> ServiceError {
-        ServiceError::CaptchaError(e)
+        ServiceError::CaptchaError(e)
     }
 }
 
 #[cfg(not(tarpaulin_include))]
-impl From<sqlx::Error> for ServiceError {
+impl From<sqlx::Error> for ServiceError {
     #[cfg(not(tarpaulin_include))]
-    fn from(e: sqlx::Error) -> Self {
-        use sqlx::error::Error;
-        use std::borrow::Cow;
-        if let Error::Database(err) = e {
-            if err.code() == Some(Cow::from("23505")) {
-                return ServiceError::UsernameTaken;
+    fn from(e: sqlx::Error) -> Self {
+        use sqlx::error::Error;
+        use std::borrow::Cow;
+        if let Error::Database(err) = e {
+            if err.code() == Some(Cow::from("23505")) {
+                return ServiceError::UsernameTaken;
             }
         }
-        ServiceError::InternalServerError
+        ServiceError::InternalServerError
     }
 }
 
 #[cfg(not(tarpaulin_include))]
-pub type ServiceResult<V> = std::result::Result<V, ServiceError>;
+impl From<SmtpError> for ServiceError {
+    #[cfg(not(tarpaulin_include))]
+    fn from(e: SmtpError) -> Self {
+        ServiceError::UnableToSendEmail(SmtpErrorWrapper(e))
+    }
+}
+
+#[cfg(not(tarpaulin_include))]
+pub type ServiceResult<V> = std::result::Result<V, ServiceError>;
 
 #[derive(Debug, Display, PartialEq, Error)]
 #[cfg(not(tarpaulin_include))]
@@ -468,10 +536,10 @@
 }
 
 #[cfg(not(tarpaulin_include))]
-impl From<sqlx::Error> for PageError {
+impl From<sqlx::Error> for PageError {
     #[cfg(not(tarpaulin_include))]
-    fn from(_: sqlx::Error) -> Self {
-        PageError::InternalServerError
+    fn from(_: sqlx::Error) -> Self {
+        PageError::InternalServerError
     }
 }
 
@@ -479,19 +547,19 @@
 impl From<ServiceError> for PageError {
     #[cfg(not(tarpaulin_include))]
     fn from(e: ServiceError) -> Self {
-        PageError::ServiceError(e)
+        PageError::ServiceError(e)
     }
 }
 
 impl ResponseError for PageError {
     fn error_response(&self) -> HttpResponse {
-        use crate::PAGES;
+        use crate::PAGES;
         match self.status_code() {
-            StatusCode::INTERNAL_SERVER_ERROR => HttpResponse::Found()
-                .header(header::LOCATION, PAGES.errors.internal_server_error)
+            StatusCode::INTERNAL_SERVER_ERROR => HttpResponse::Found()
+                .append_header((header::LOCATION, PAGES.errors.internal_server_error))
                 .finish(),
-            _ => HttpResponse::Found()
-                .header(header::LOCATION, PAGES.errors.unknown_error)
+            _ => HttpResponse::Found()
+                .append_header((header::LOCATION, PAGES.errors.unknown_error))
                 .finish(),
         }
     }
@@ -499,31 +567,31 @@
     #[cfg(not(tarpaulin_include))]
     fn status_code(&self) -> StatusCode {
         match self {
-            PageError::InternalServerError => StatusCode::INTERNAL_SERVER_ERROR,
-            PageError::ServiceError(e) => e.status_code(),
+            PageError::InternalServerError => StatusCode::INTERNAL_SERVER_ERROR,
+            PageError::ServiceError(e) => e.status_code(),
         }
     }
 }
 
 #[cfg(not(tarpaulin_include))]
-pub type PageResult<V> = std::result::Result<V, PageError>;
+pub type PageResult<V> = std::result::Result<V, PageError>;
 
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::PAGES;
+    use crate::PAGES;
 
     #[test]
     fn error_works() {
-        let resp: HttpResponse = PageError::InternalServerError.error_response();
-        assert_eq!(resp.status(), StatusCode::FOUND);
+        let resp: HttpResponse = PageError::InternalServerError.error_response();
+        assert_eq!(resp.status(), StatusCode::FOUND);
         let headers = resp.headers();
-        assert_eq!(
-            headers.get(header::LOCATION).unwrap(),
+        assert_eq!(
+            headers.get(header::LOCATION).unwrap(),
             PAGES.errors.internal_server_error
         );
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/main.rs.html b/src/mcaptcha/main.rs.html index 4d3ea2b4..fc29fbb4 100644 --- a/src/mcaptcha/main.rs.html +++ b/src/mcaptcha/main.rs.html @@ -1,7 +1,7 @@ -main.rs - source +main.rs - source -
  1
+
  1
   2
   3
   4
@@ -171,6 +171,7 @@
 168
 169
 170
+171
 
 /*
  * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -188,21 +189,21 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-use std::env;
-use std::sync::Arc;
+use std::env;
+use std::sync::Arc;
 
 use actix_identity::{CookieIdentityPolicy, IdentityService};
 use actix_web::{
-    error::InternalError, http::StatusCode, middleware as actix_middleware,
-    web::JsonConfig, App, HttpServer,
+    error::InternalError, http::StatusCode, middleware as actix_middleware,
+    web::JsonConfig, App, HttpServer,
 };
-use lazy_static::lazy_static;
-use log::info;
+use lazy_static::lazy_static;
+use log::info;
 
 mod api;
 mod data;
 mod docs;
-//mod email;
+mod email;
 mod errors;
 mod middleware;
 #[macro_use]
@@ -217,20 +218,20 @@
 mod tests;
 mod widget;
 
-pub use crate::data::Data;
-pub use api::v1::ROUTES as V1_API_ROUTES;
-pub use docs::DOCS;
-pub use pages::routes::ROUTES as PAGES;
-pub use settings::Settings;
-use static_assets::FileMap;
-pub use widget::WIDGET_ROUTES;
+pub use crate::data::Data;
+pub use api::v1::ROUTES as V1_API_ROUTES;
+pub use docs::DOCS;
+pub use pages::routes::ROUTES as PAGES;
+pub use settings::Settings;
+use static_assets::FileMap;
+pub use widget::WIDGET_ROUTES;
 
-pub use crate::middleware::auth::CheckLogin;
+pub use crate::middleware::auth::CheckLogin;
 
-lazy_static! {
-    pub static ref SETTINGS: Settings = Settings::new().unwrap();
+lazy_static! {
+    pub static ref SETTINGS: Settings = Settings::new().unwrap();
 //    pub static ref S: String = env::var("S").unwrap();
-    pub static ref FILES: FileMap = FileMap::new();
+    pub static ref FILES: FileMap = FileMap::new();
     pub static ref JS: &'static str =
         FILES.get("./static/cache/bundle/bundle.js").unwrap();
     pub static ref CSS: &'static str =
@@ -248,7 +249,7 @@
         if !url.ends_with('/') {
             url.push('/');
         }
-        let mut  base = url::Url::parse(&url).unwrap();
+        let mut  base = url::Url::parse(&url).unwrap();
         base =  base.join("tree/").unwrap();
         base =  base.join(GIT_COMMIT_HASH).unwrap();
         base.into()
@@ -256,50 +257,51 @@
 
 }
 
-pub static OPEN_API_DOC: &str = env!("OPEN_API_DOCS");
-pub static GIT_COMMIT_HASH: &str = env!("GIT_HASH");
-pub static VERSION: &str = env!("CARGO_PKG_VERSION");
-pub static PKG_NAME: &str = env!("CARGO_PKG_NAME");
-pub static PKG_DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
-pub static PKG_HOMEPAGE: &str = env!("CARGO_PKG_HOMEPAGE");
+pub static OPEN_API_DOC: &str = env!("OPEN_API_DOCS");
+pub static GIT_COMMIT_HASH: &str = env!("GIT_HASH");
+pub static VERSION: &str = env!("CARGO_PKG_VERSION");
+pub static PKG_NAME: &str = env!("CARGO_PKG_NAME");
+pub static PKG_DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
+pub static PKG_HOMEPAGE: &str = env!("CARGO_PKG_HOMEPAGE");
 
 pub const CACHE_AGE: u32 = 604800;
 
-pub type AppData = actix_web::web::Data<Arc<crate::data::Data>>;
+pub type AppData = actix_web::web::Data<Arc<crate::data::Data>>;
 
 #[cfg(not(tarpaulin_include))]
-#[actix_web::main]
-async fn main() -> std::io::Result<()> {
-    use api::v1;
-    pretty_env_logger::init();
-    info!(
+#[actix_web::main]
+async fn main() -> std::io::Result<()> {
+    use api::v1;
+    pretty_env_logger::init();
+    info!(
         "{}: {}.\nFor more information, see: {}\nBuild info:\nVersion: {} commit: {}",
         PKG_NAME, PKG_DESCRIPTION, PKG_HOMEPAGE, VERSION, GIT_COMMIT_HASH
     );
 
-    let data = Data::new().await;
-    sqlx::migrate!("./migrations/").run(&data.db).await.unwrap();
+    let data = Data::new().await;
+    sqlx::migrate!("./migrations/").run(&data.db).await.unwrap();
+    let data = actix_web::web::Data::new(data);
 
-    println!("Starting server on: http://{}", SETTINGS.server.get_ip());
+    println!("Starting server on: http://{}", SETTINGS.server.get_ip());
 
-    HttpServer::new(move || {
-        App::new()
-            .wrap(actix_middleware::Logger::default())
+    HttpServer::new(move || {
+        App::new()
+            .wrap(actix_middleware::Logger::default())
             .wrap(
-                actix_middleware::DefaultHeaders::new()
+                actix_middleware::DefaultHeaders::new()
                     .header("Permissions-Policy", "interest-cohort=()"),
             )
             .wrap(get_identity_service())
-            .wrap(actix_middleware::Compress::default())
-            .data(data.clone())
-            .wrap(actix_middleware::NormalizePath::new(
-                actix_middleware::normalize::TrailingSlash::Trim,
+            .wrap(actix_middleware::Compress::default())
+            .app_data(data.clone())
+            .wrap(actix_middleware::NormalizePath::new(
+                actix_middleware::TrailingSlash::Trim,
             ))
-            .configure(v1::services)
-            .configure(widget::services)
-            .configure(docs::services)
-            .configure(pages::services)
-            .configure(static_assets::services)
+            .configure(v1::services)
+            .configure(widget::services)
+            .configure(docs::services)
+            .configure(pages::services)
+            .configure(static_assets::services)
             .app_data(get_json_err())
     })
     .bind(SETTINGS.server.get_ip())
@@ -310,20 +312,20 @@
 
 #[cfg(not(tarpaulin_include))]
 pub fn get_json_err() -> JsonConfig {
-    JsonConfig::default().error_handler(|err, _| {
+    JsonConfig::default().error_handler(|err, _| {
         //debug!("JSON deserialization error: {:?}", &err);
-        InternalError::new(err, StatusCode::BAD_REQUEST).into()
+        InternalError::new(err, StatusCode::BAD_REQUEST).into()
     })
 }
 
 #[cfg(not(tarpaulin_include))]
 pub fn get_identity_service() -> IdentityService<CookieIdentityPolicy> {
     let cookie_secret = &SETTINGS.server.cookie_secret;
-    IdentityService::new(
-        CookieIdentityPolicy::new(cookie_secret.as_bytes())
+    IdentityService::new(
+        CookieIdentityPolicy::new(cookie_secret.as_bytes())
             .name("Authorization")
             //TODO change cookie age
-            .max_age(216000)
+            .max_age_secs(216000)
             .domain(&SETTINGS.server.domain)
             .secure(false),
     )
@@ -333,15 +335,15 @@
 mod test {
     #[test]
     fn version_source_code_url_works() {
-        assert_eq!(
-            &*crate::SOURCE_FILES_OF_INSTANCE,
-            &format!(
+        assert_eq!(
+            &*crate::SOURCE_FILES_OF_INSTANCE,
+            &format!(
                 "https://github.com/mCaptcha/mCaptcha/tree/{}",
-                crate::GIT_COMMIT_HASH
+                crate::GIT_COMMIT_HASH
             )
         );
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/middleware/auth.rs.html b/src/mcaptcha/middleware/auth.rs.html index 7fd29d21..34c8bfe4 100644 --- a/src/mcaptcha/middleware/auth.rs.html +++ b/src/mcaptcha/middleware/auth.rs.html @@ -1,93 +1,112 @@ -auth.rs - source +auth.rs - source -
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
+
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -106,33 +125,33 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-#![allow(clippy::type_complexity)]
-use std::task::{Context, Poll};
+#![allow(clippy::type_complexity)]
+//use std::task::{Context, Poll};
 
-use actix_identity::Identity;
+use actix_http::body::AnyBody;
+use actix_identity::Identity;
 use actix_service::{Service, Transform};
-use actix_web::dev::{ServiceRequest, ServiceResponse};
+use actix_web::dev::{ServiceRequest, ServiceResponse};
 use actix_web::{http, Error, FromRequest, HttpResponse};
 
-use futures::future::{ok, Either, Ready};
+use futures::future::{ok, Either, Ready};
 
-use crate::PAGES;
+use crate::PAGES;
 
 pub struct CheckLogin;
 
-impl<S, B> Transform<S> for CheckLogin
+impl<S> Transform<S, ServiceRequest> for CheckLogin
 where
-    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
-    S::Future: 'static,
+    S: Service<ServiceRequest, Response = ServiceResponse<AnyBody>, Error = Error>,
+    S::Future: 'static,
 {
-    type Request = ServiceRequest;
-    type Response = ServiceResponse<B>;
+    type Response = ServiceResponse<AnyBody>;
     type Error = Error;
     type Transform = CheckLoginMiddleware<S>;
     type InitError = ();
-    type Future = Ready<Result<Self::Transform, Self::InitError>>;
+    type Future = Ready<Result<Self::Transform, Self::InitError>>;
 
-    fn new_transform(&self, service: S) -> Self::Future {
+    fn new_transform(&self, service: S) -> Self::Future {
         ok(CheckLoginMiddleware { service })
     }
 }
@@ -140,42 +159,61 @@
     service: S,
 }
 
-impl<S, B> Service for CheckLoginMiddleware<S>
+impl<S> Service<ServiceRequest> for CheckLoginMiddleware<S>
 where
-    S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
-    S::Future: 'static,
+    S: Service<ServiceRequest, Response = ServiceResponse<AnyBody>, Error = Error>,
+    S::Future: 'static,
 {
-    type Request = ServiceRequest;
-    type Response = ServiceResponse<B>;
+    type Response = ServiceResponse<AnyBody>;
     type Error = Error;
-    type Future = Either<S::Future, Ready<Result<Self::Response, Self::Error>>>;
+    type Future = Either<S::Future, Ready<Result<Self::Response, Self::Error>>>;
 
-    fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> {
-        self.service.poll_ready(cx)
-    }
+    //    fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> {
+    //        self.service.poll_ready(cx)
+    //    }
+    //
+    actix_service::forward_ready!(service);
+
+    fn call(&self, req: ServiceRequest) -> Self::Future {
+        //    let (r, mut pl) = req.into_parts();
+
+        //    // TODO investigate when the bellow statement will
+        //    // return error
+        //    if let Ok(Some(_)) = Identity::from_request(&r, &mut pl)
+        //        .into_inner()
+        //        .map(|x| x.identity())
+        //    {
+        //        let req = ServiceRequest::from_parts(r, pl);
+        //        Either::Left(self.service.call(req))
+        //    } else {
+        //        let resp = actix_http::ResponseBuilder::new(http::StatusCode::FOUND)
+        //            .insert_header((http::header::LOCATION, PAGES.auth.login))
+        //            .finish();
+
+        //        let req = ServiceRequest::from_parts(r, pl);
+        //        Either::Right(ok(req.into_response(resp)))
+        //    }
 
-    fn call(&mut self, req: ServiceRequest) -> Self::Future {
         let (r, mut pl) = req.into_parts();
 
         // TODO investigate when the bellow statement will
         // return error
-        if let Ok(Some(_)) = Identity::from_request(&r, &mut pl)
+        if let Ok(Some(_)) = Identity::from_request(&r, &mut pl)
             .into_inner()
             .map(|x| x.identity())
         {
-            let req = ServiceRequest::from_parts(r, pl).ok().unwrap();
-            Either::Left(self.service.call(req))
+            let req = ServiceRequest::from_parts(r, pl);
+            Either::Left(self.service.call(req))
         } else {
-            let req = ServiceRequest::from_parts(r, pl).ok().unwrap();
-            Either::Right(ok(req.into_response(
-                HttpResponse::Found()
-                    .header(http::header::LOCATION, PAGES.auth.login)
-                    .finish()
-                    .into_body(),
+            let req = ServiceRequest::from_parts(r, pl); //.ok().unwrap();
+            Either::Right(ok(req.into_response(
+                HttpResponse::Found()
+                    .insert_header((http::header::LOCATION, PAGES.auth.login))
+                    .finish(),
             )))
         }
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/middleware/mod.rs.html b/src/mcaptcha/middleware/mod.rs.html index f356a5b9..72e4c02f 100644 --- a/src/mcaptcha/middleware/mod.rs.html +++ b/src/mcaptcha/middleware/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -39,5 +39,5 @@
 
 pub mod auth;
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/auth/login.rs.html b/src/mcaptcha/pages/auth/login.rs.html index c587305f..9053b4ac 100644 --- a/src/mcaptcha/pages/auth/login.rs.html +++ b/src/mcaptcha/pages/auth/login.rs.html @@ -1,7 +1,7 @@ -login.rs - source +login.rs - source -
 1
+
 1
  2
  3
  4
@@ -65,11 +65,11 @@
 */
 
 use actix_web::{HttpResponse, Responder};
-use lazy_static::lazy_static;
-use my_codegen::get;
-use sailfish::TemplateOnce;
+use lazy_static::lazy_static;
+use my_codegen::get;
+use sailfish::TemplateOnce;
 
-use crate::PAGES;
+use crate::PAGES;
 
 #[derive(Clone, TemplateOnce)]
 #[template(path = "auth/login/index.html")]
@@ -82,16 +82,16 @@
     }
 }
 
-lazy_static! {
-    static ref INDEX: String = IndexPage::default().render_once().unwrap();
+lazy_static! {
+    static ref INDEX: String = IndexPage::default().render_once().unwrap();
 }
 
 #[get(path = "PAGES.auth.login")]
 pub async fn login() -> impl Responder {
-    HttpResponse::Ok()
+    HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(&*INDEX)
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/auth/mod.rs.html b/src/mcaptcha/pages/auth/mod.rs.html index d3f64d37..7af3443c 100644 --- a/src/mcaptcha/pages/auth/mod.rs.html +++ b/src/mcaptcha/pages/auth/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -61,9 +61,9 @@
 pub mod login;
 pub mod register;
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
-    cfg.service(login::login);
-    cfg.service(register::join);
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+    cfg.service(login::login);
+    cfg.service(register::join);
 }
 
 pub mod routes {
@@ -81,5 +81,5 @@
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/auth/register.rs.html b/src/mcaptcha/pages/auth/register.rs.html index c72993a6..c3c43365 100644 --- a/src/mcaptcha/pages/auth/register.rs.html +++ b/src/mcaptcha/pages/auth/register.rs.html @@ -1,7 +1,7 @@ -register.rs - source +register.rs - source -
 1
+
 1
  2
  3
  4
@@ -63,8 +63,8 @@
 */
 
 use actix_web::{HttpResponse, Responder};
-use lazy_static::lazy_static;
-use sailfish::TemplateOnce;
+use lazy_static::lazy_static;
+use sailfish::TemplateOnce;
 
 #[derive(Clone, TemplateOnce)]
 #[template(path = "auth/register/index.html")]
@@ -78,16 +78,16 @@
     }
 }
 
-lazy_static! {
-    static ref INDEX: String = IndexPage::default().render_once().unwrap();
+lazy_static! {
+    static ref INDEX: String = IndexPage::default().render_once().unwrap();
 }
 
-#[my_codegen::get(path = "crate::PAGES.auth.join")]
+#[my_codegen::get(path = "crate::PAGES.auth.join")]
 pub async fn join() -> impl Responder {
-    HttpResponse::Ok()
+    HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(&*INDEX)
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/errors.rs.html b/src/mcaptcha/pages/errors.rs.html index 9036387a..0571ff77 100644 --- a/src/mcaptcha/pages/errors.rs.html +++ b/src/mcaptcha/pages/errors.rs.html @@ -1,7 +1,7 @@ -errors.rs - source +errors.rs - source -
  1
+
  1
   2
   3
   4
@@ -135,10 +135,10 @@
 * You should have received a copy of the GNU Affero General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>. */
 
 use actix_web::{web, HttpResponse, Responder};
-use lazy_static::lazy_static;
-use sailfish::TemplateOnce;
+use lazy_static::lazy_static;
+use sailfish::TemplateOnce;
 
-use crate::errors::PageError;
+use crate::errors::PageError;
 
 #[derive(Clone, TemplateOnce)]
 #[template(path = "errors/index.html")]
@@ -155,28 +155,28 @@
     }
 }
 
-lazy_static! {
-    static ref INTERNAL_SERVER_ERROR_BODY: String = ErrorPage::new(
+lazy_static! {
+    static ref INTERNAL_SERVER_ERROR_BODY: String = ErrorPage::new(
         "Internal Server Error",
-        &format!("{}", PageError::InternalServerError),
+        &format!("{}", PageError::InternalServerError),
     )
     .render_once()
     .unwrap();
-    static ref UNKNOWN_ERROR_BODY: String = ErrorPage::new(
+    static ref UNKNOWN_ERROR_BODY: String = ErrorPage::new(
         "Something went wrong",
-        &format!("{}", PageError::InternalServerError),
+        &format!("{}", PageError::InternalServerError),
     )
     .render_once()
     .unwrap();
 }
 
-async fn error(path: web::Path<usize>) -> impl Responder {
-    let resp = match path.0 {
-        500 => HttpResponse::InternalServerError()
+async fn error(path: web::Path<usize>) -> impl Responder {
+    let resp = match path.into_inner() {
+        500 => HttpResponse::InternalServerError()
             .content_type("text/html; charset=utf-8")
             .body(&*INTERNAL_SERVER_ERROR_BODY),
 
-        _ => HttpResponse::InternalServerError()
+        _ => HttpResponse::InternalServerError()
             .content_type("text/html; charset=utf-8")
             .body(&*UNKNOWN_ERROR_BODY),
     };
@@ -184,10 +184,10 @@
     resp
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
-    use crate::define_resource;
+pub fn services(cfg: &mut web::ServiceConfig) {
+    use crate::define_resource;
 
-    define_resource!(cfg, "/error/{id}", Methods::Get, error);
+    define_resource!(cfg, "/error/{id}", Methods::Get, error);
 }
 
 pub mod routes {
@@ -208,34 +208,34 @@
 
 #[cfg(test)]
 mod tests {
-    use actix_web::{http::StatusCode, test, App};
+    use actix_web::{http::StatusCode, test, App};
 
     use super::*;
-    use crate::PAGES;
+    use crate::PAGES;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn error_pages_work() {
-        let mut app = test::init_service(App::new().configure(services)).await;
+        let mut app = test::init_service(App::new().configure(services)).await;
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(PAGES.errors.internal_server_error)
                 .to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR);
+        assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR);
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(PAGES.errors.unknown_error)
                 .to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR);
+        assert_eq!(resp.status(), StatusCode::INTERNAL_SERVER_ERROR);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/mod.rs.html b/src/mcaptcha/pages/mod.rs.html index 56e789f7..def1f1b8 100644 --- a/src/mcaptcha/pages/mod.rs.html +++ b/src/mcaptcha/pages/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
  1
+
  1
   2
   3
   4
@@ -104,13 +104,6 @@
 101
 102
 103
-104
-105
-106
-107
-108
-109
-110
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -129,7 +122,7 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_web::web::ServiceConfig;
+use actix_web::web::ServiceConfig;
 
 mod auth;
 pub mod errors;
@@ -139,89 +132,82 @@
 pub const NAME: &str = "mCaptcha";
 
 pub fn services(cfg: &mut ServiceConfig) {
-    auth::services(cfg);
-    panel::services(cfg);
-    errors::services(cfg);
+    auth::services(cfg);
+    panel::services(cfg);
+    errors::services(cfg);
 }
 
 #[cfg(not(tarpaulin_include))]
 #[cfg(test)]
 mod tests {
-    use actix_web::http::StatusCode;
-    use actix_web::test;
+    use actix_web::http::StatusCode;
+    use actix_web::test;
 
     use super::*;
-    use crate::tests::*;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn protected_pages_templates_work() {
         const NAME: &str = "templateuser";
         const PASSWORD: &str = "longpassword";
         const EMAIL: &str = "templateuser@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         let (data, _, signin_resp) = register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
+        let cookies = get_cookie!(signin_resp);
 
-        let mut app = test::init_service(
-            App::new()
-                .wrap(get_identity_service())
-                .configure(crate::api::v1::services)
-                .configure(services)
-                .data(data.clone()),
-        )
-        .await;
+        let mut app = get_app!(data).await;
 
-        let urls = vec![
+        let urls = vec![
             PAGES.home,
             PAGES.panel.sitekey.add,
             PAGES.panel.sitekey.list,
         ];
 
         for url in urls.iter() {
-            let resp = test::call_service(
+            let resp = test::call_service(
                 &mut app,
-                test::TestRequest::get().uri(url).to_request(),
+                test::TestRequest::get().uri(url).to_request(),
             )
             .await;
-            assert_eq!(resp.status(), StatusCode::FOUND);
+            assert_eq!(resp.status(), StatusCode::FOUND);
 
-            let authenticated_resp = test::call_service(
+            let authenticated_resp = test::call_service(
                 &mut app,
-                test::TestRequest::get()
+                test::TestRequest::get()
                     .uri(url)
                     .cookie(cookies.clone())
                     .to_request(),
             )
             .await;
 
-            assert_eq!(authenticated_resp.status(), StatusCode::OK);
+            assert_eq!(authenticated_resp.status(), StatusCode::OK);
         }
 
         delete_user(NAME, &data).await;
     }
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn public_pages_tempaltes_work() {
-        let mut app = test::init_service(App::new().configure(services)).await;
-        let urls = vec![PAGES.auth.login, PAGES.auth.join];
+        let mut app = test::init_service(App::new().configure(services)).await;
+        let urls = vec![PAGES.auth.login, PAGES.auth.join];
 
         for url in urls.iter() {
-            let resp = test::call_service(
+            let resp = test::call_service(
                 &mut app,
-                test::TestRequest::get().uri(url).to_request(),
+                test::TestRequest::get().uri(url).to_request(),
             )
             .await;
 
-            assert_eq!(resp.status(), StatusCode::OK);
+            assert_eq!(resp.status(), StatusCode::OK);
         }
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/panel/mod.rs.html b/src/mcaptcha/pages/panel/mod.rs.html index 134b0767..35d79802 100644 --- a/src/mcaptcha/pages/panel/mod.rs.html +++ b/src/mcaptcha/pages/panel/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -90,15 +90,15 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{HttpResponse, Responder};
-use sailfish::TemplateOnce;
+use sailfish::TemplateOnce;
 
 pub mod sitekey;
 
-use crate::errors::PageResult;
-use crate::AppData;
-use sitekey::list::{get_list_sitekeys, SiteKeys};
+use crate::errors::PageResult;
+use crate::AppData;
+use sitekey::list::{get_list_sitekeys, SiteKeys};
 
 #[derive(TemplateOnce, Clone)]
 #[template(path = "panel/index.html")]
@@ -114,22 +114,22 @@
 
 const PAGE: &str = "Dashboard";
 
-#[my_codegen::get(path = "crate::PAGES.panel.home", wrap = "crate::CheckLogin")]
+#[my_codegen::get(path = "crate::PAGES.panel.home", wrap = "crate::CheckLogin")]
 async fn panel(data: AppData, id: Identity) -> PageResult<impl Responder> {
     let sitekeys = get_list_sitekeys(&data, &id).await?;
-    let body = IndexPage::new(sitekeys).render_once().unwrap();
-    Ok(HttpResponse::Ok()
+    let body = IndexPage::new(sitekeys).render_once().unwrap();
+    Ok(HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(body))
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
     cfg.service(panel);
-    sitekey::services(cfg);
+    sitekey::services(cfg);
 }
 
 pub mod routes {
-    use super::sitekey::routes::Sitekey;
+    use super::sitekey::routes::Sitekey;
     pub struct Panel {
         pub home: &'static str,
         pub sitekey: Sitekey,
@@ -139,11 +139,11 @@
         pub const fn new() -> Self {
             Panel {
                 home: "/",
-                sitekey: Sitekey::new(),
+                sitekey: Sitekey::new(),
             }
         }
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/panel/sitekey/add.rs.html b/src/mcaptcha/pages/panel/sitekey/add.rs.html index 90cccc2d..9c51402e 100644 --- a/src/mcaptcha/pages/panel/sitekey/add.rs.html +++ b/src/mcaptcha/pages/panel/sitekey/add.rs.html @@ -1,7 +1,7 @@ -add.rs - source +add.rs - source -
 1
+
 1
  2
  3
  4
@@ -73,13 +73,13 @@
 */
 
 use actix_web::{HttpResponse, Responder};
-use lazy_static::lazy_static;
-use sailfish::TemplateOnce;
+use lazy_static::lazy_static;
+use sailfish::TemplateOnce;
 
 const PAGE: &str = "Add Sitekey";
 
-lazy_static! {
-    static ref INDEX: String = IndexPage::default().render_once().unwrap();
+lazy_static! {
+    static ref INDEX: String = IndexPage::default().render_once().unwrap();
 }
 
 #[derive(TemplateOnce, Clone)]
@@ -102,12 +102,12 @@
     }
 }
 
-#[my_codegen::get(path = "crate::PAGES.panel.sitekey.add", wrap = "crate::CheckLogin")]
+#[my_codegen::get(path = "crate::PAGES.panel.sitekey.add", wrap = "crate::CheckLogin")]
 pub async fn add_sitekey() -> impl Responder {
-    HttpResponse::Ok()
+    HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(&*INDEX)
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/panel/sitekey/list.rs.html b/src/mcaptcha/pages/panel/sitekey/list.rs.html index 17cec061..3f46447b 100644 --- a/src/mcaptcha/pages/panel/sitekey/list.rs.html +++ b/src/mcaptcha/pages/panel/sitekey/list.rs.html @@ -1,7 +1,7 @@ -list.rs - source +list.rs - source -
  1
+
  1
   2
   3
   4
@@ -136,13 +136,13 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{HttpResponse, Responder};
-use sailfish::TemplateOnce;
+use sailfish::TemplateOnce;
 
-use crate::api::v1::mcaptcha::captcha::MCaptchaDetails;
-use crate::errors::*;
-use crate::AppData;
+use crate::api::v1::mcaptcha::captcha::MCaptchaDetails;
+use crate::errors::*;
+use crate::AppData;
 
 #[derive(TemplateOnce, Clone)]
 #[template(path = "panel/sitekey/list/index.html")]
@@ -159,11 +159,11 @@
 }
 
 /// render a list of all sitekeys that a user has
-#[my_codegen::get(path = "crate::PAGES.panel.sitekey.list", wrap = "crate::CheckLogin")]
+#[my_codegen::get(path = "crate::PAGES.panel.sitekey.list", wrap = "crate::CheckLogin")]
 pub async fn list_sitekeys(data: AppData, id: Identity) -> PageResult<impl Responder> {
     let res = get_list_sitekeys(&data, &id).await?;
-    let body = IndexPage::new(res).render_once().unwrap();
-    Ok(HttpResponse::Ok()
+    let body = IndexPage::new(res).render_once().unwrap();
+    Ok(HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(body))
 }
@@ -171,7 +171,7 @@
 /// utility function to get a list of all sitekeys that a user owns
 pub async fn get_list_sitekeys(data: &AppData, id: &Identity) -> PageResult<SiteKeys> {
     let username = id.identity().unwrap();
-    let res = sqlx::query_as!(
+    let res = sqlx::query_as!(
         MCaptchaDetails,
         "SELECT key, name from mcaptcha_config WHERE
         user_id = (SELECT ID FROM mcaptcha_users WHERE name = $1) ",
@@ -186,43 +186,43 @@
 
 #[cfg(test)]
 mod test {
-    use actix_web::http::StatusCode;
-    use actix_web::test;
-    use actix_web::web::Bytes;
+    use actix_web::http::StatusCode;
+    use actix_web::test;
+    use actix_web::web::Bytes;
 
-    use crate::tests::*;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn list_sitekeys_work() {
         const NAME: &str = "listsitekeyuser";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "listsitekeyuser@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, signin_resp, key) = add_levels_util(NAME, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
+        let cookies = get_cookie!(signin_resp);
 
-        let mut app = get_app!(data).await;
+        let mut app = get_app!(data).await;
 
-        let list_sitekey_resp = test::call_service(
+        let list_sitekey_resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(PAGES.panel.sitekey.list)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
 
-        assert_eq!(list_sitekey_resp.status(), StatusCode::OK);
+        assert_eq!(list_sitekey_resp.status(), StatusCode::OK);
 
-        let body: Bytes = test::read_body(list_sitekey_resp).await;
-        let body = String::from_utf8(body.to_vec()).unwrap();
+        let body: Bytes = test::read_body(list_sitekey_resp).await;
+        let body = String::from_utf8(body.to_vec()).unwrap();
 
         //        Bytes::from(key.key)
         //            .iter()
@@ -232,10 +232,10 @@
         //            .iter()
         //            .for_each(|e| assert!(body.contains(e)));
 
-        assert!(body.contains(&key.key));
-        assert!(body.contains(&key.name));
+        assert!(body.contains(&key.key));
+        assert!(body.contains(&key.name));
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/panel/sitekey/mod.rs.html b/src/mcaptcha/pages/panel/sitekey/mod.rs.html index 2f61da40..531c9529 100644 --- a/src/mcaptcha/pages/panel/sitekey/mod.rs.html +++ b/src/mcaptcha/pages/panel/sitekey/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -85,11 +85,11 @@
     }
 }
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
-    cfg.service(add::add_sitekey);
-    cfg.service(list::list_sitekeys);
-    cfg.service(view::view_sitekey);
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+    cfg.service(add::add_sitekey);
+    cfg.service(list::list_sitekeys);
+    cfg.service(view::view_sitekey);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/panel/sitekey/view.rs.html b/src/mcaptcha/pages/panel/sitekey/view.rs.html index 4fbf676e..d397ba3d 100644 --- a/src/mcaptcha/pages/panel/sitekey/view.rs.html +++ b/src/mcaptcha/pages/panel/sitekey/view.rs.html @@ -1,7 +1,7 @@ -view.rs - source +view.rs - source -
  1
+
  1
   2
   3
   4
@@ -170,14 +170,14 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use actix_identity::Identity;
+use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
-use futures::{future::TryFutureExt, try_join};
-use sailfish::TemplateOnce;
+use futures::{future::TryFutureExt, try_join};
+use sailfish::TemplateOnce;
 
-use crate::errors::*;
-use crate::stats::fetch::Stats;
-use crate::AppData;
+use crate::errors::*;
+use crate::stats::fetch::Stats;
+use crate::AppData;
 
 const PAGE: &str = "SiteKeys";
 
@@ -214,16 +214,16 @@
 }
 
 /// route handler that renders individual views for sitekeys
-#[my_codegen::get(path = "crate::PAGES.panel.sitekey.view", wrap = "crate::CheckLogin")]
+#[my_codegen::get(path = "crate::PAGES.panel.sitekey.view", wrap = "crate::CheckLogin")]
 pub async fn view_sitekey(
-    path: web::Path<String>,
+    path: web::Path<String>,
     data: AppData,
     id: Identity,
 ) -> PageResult<impl Responder> {
     let username = id.identity().unwrap();
-    let key = path.0;
+    let key = path.into_inner();
 
-    let config = sqlx::query_as!(
+    let config = sqlx::query_as!(
         McaptchaConfig,
         "SELECT config_id, duration, name from mcaptcha_config WHERE
         key = $1 AND
@@ -234,7 +234,7 @@
     .fetch_one(&data.db)
     .await?;
 
-    let levels_fut = sqlx::query_as!(
+    let levels_fut = sqlx::query_as!(
         Level,
         "SELECT 
             difficulty_factor, visitor_threshold 
@@ -246,64 +246,64 @@
     .fetch_all(&data.db)
     .err_into();
 
-    let (_stats, levels) = try_join!(Stats::new(&key, &data.db), levels_fut)?;
+    let (_stats, levels) = try_join!(Stats::new(&key, &data.db), levels_fut)?;
 
-    let body = IndexPage::new(config, levels, key).render_once().unwrap();
-    Ok(HttpResponse::Ok()
+    let body = IndexPage::new(config, levels, key).render_once().unwrap();
+    Ok(HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(body))
 }
 
 #[cfg(test)]
 mod test {
-    use actix_web::http::StatusCode;
-    use actix_web::test;
-    use actix_web::web::Bytes;
+    use actix_web::http::StatusCode;
+    use actix_web::test;
+    use actix_web::web::Bytes;
 
-    use crate::tests::*;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn view_sitekey_work() {
         const NAME: &str = "viewsitekeyuser";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "viewsitekeyuser@a.com";
 
         {
-            let data = Data::new().await;
+            let data = Data::new().await;
             delete_user(NAME, &data).await;
         }
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (data, _, signin_resp, key) = add_levels_util(NAME, PASSWORD).await;
-        let cookies = get_cookie!(signin_resp);
+        let cookies = get_cookie!(signin_resp);
 
-        let mut app = get_app!(data).await;
+        let mut app = get_app!(data).await;
 
-        let url = format!("/sitekey/{}/view", &key.key);
+        let url = format!("/sitekey/{}/view", &key.key);
 
-        let list_sitekey_resp = test::call_service(
+        let list_sitekey_resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(&url)
                 .cookie(cookies.clone())
                 .to_request(),
         )
         .await;
 
-        assert_eq!(list_sitekey_resp.status(), StatusCode::OK);
+        assert_eq!(list_sitekey_resp.status(), StatusCode::OK);
 
-        let body: Bytes = test::read_body(list_sitekey_resp).await;
-        let body = String::from_utf8(body.to_vec()).unwrap();
+        let body: Bytes = test::read_body(list_sitekey_resp).await;
+        let body = String::from_utf8(body.to_vec()).unwrap();
 
-        assert!(body.contains(&key.name));
+        assert!(body.contains(&key.name));
 
-        assert!(body.contains(&L1.visitor_threshold.to_string()));
-        assert!(body.contains(&L1.difficulty_factor.to_string()));
-        assert!(body.contains(&L2.difficulty_factor.to_string()));
-        assert!(body.contains(&L2.visitor_threshold.to_string()));
+        assert!(body.contains(&L1.visitor_threshold.to_string()));
+        assert!(body.contains(&L1.difficulty_factor.to_string()));
+        assert!(body.contains(&L2.difficulty_factor.to_string()));
+        assert!(body.contains(&L2.visitor_threshold.to_string()));
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/pages/routes.rs.html b/src/mcaptcha/pages/routes.rs.html index 9ac6fc4a..2e77bd62 100644 --- a/src/mcaptcha/pages/routes.rs.html +++ b/src/mcaptcha/pages/routes.rs.html @@ -1,7 +1,7 @@ -routes.rs - source +routes.rs - source -
 1
+
 1
  2
  3
  4
@@ -70,10 +70,10 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use super::auth::routes::Auth;
-use super::errors::routes::Errors;
-use super::panel::routes::Panel;
-pub const ROUTES: Routes = Routes::new();
+use super::auth::routes::Auth;
+use super::errors::routes::Errors;
+use super::panel::routes::Panel;
+pub const ROUTES: Routes = Routes::new();
 
 pub struct Routes {
     pub home: &'static str,
@@ -89,13 +89,13 @@
 
 impl Routes {
     const fn new() -> Routes {
-        let panel = Panel::new();
+        let panel = Panel::new();
         let home = panel.home;
         Routes {
-            auth: Auth::new(),
+            auth: Auth::new(),
             panel,
             home,
-            errors: Errors::new(),
+            errors: Errors::new(),
             about: "/about",
             thanks: "/thanks",
             donate: "/donate",
@@ -105,5 +105,5 @@
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/routes.rs.html b/src/mcaptcha/routes.rs.html index b2a366e7..c7ff3aa8 100644 --- a/src/mcaptcha/routes.rs.html +++ b/src/mcaptcha/routes.rs.html @@ -1,7 +1,7 @@ -routes.rs - source +routes.rs - source -
 1
+
 1
  2
  3
  4
@@ -99,41 +99,41 @@
 
 /// Defines resoures for [Methods]
 #[macro_export]
-macro_rules! define_resource {
-    ($cfg:expr, $path:expr, Methods::Get, $to:expr) => {
+macro_rules! define_resource {
+    ($cfg:expr, $path:expr, Methods::Get, $to:expr) => {
         $cfg.service(
-            actix_web::web::resource($path)
-                .guard(actix_web::guard::Get())
+            actix_web::web::resource($path)
+                .guard(actix_web::guard::Get())
                 .to($to),
         );
     };
 
-    ($cfg:expr, $path:expr, Methods::Post, $to:expr) => {
+    ($cfg:expr, $path:expr, Methods::Post, $to:expr) => {
         $cfg.service(
-            actix_web::Resource::new($path)
-                .guard(actix_web::guard::Post())
+            actix_web::Resource::new($path)
+                .guard(actix_web::guard::Post())
                 .to($to),
         );
     };
 
-    ($cfg:expr, $path:expr, Methods::ProtectPost, $to:expr) => {
+    ($cfg:expr, $path:expr, Methods::ProtectPost, $to:expr) => {
         $cfg.service(
-            actix_web::web::resource($path)
-                .wrap(crate::CheckLogin)
-                .guard(actix_web::guard::Post())
+            actix_web::web::resource($path)
+                .wrap(crate::CheckLogin)
+                .guard(actix_web::guard::Post())
                 .to($to),
         );
     };
 
-    ($cfg:expr, $path:expr, Methods::ProtectGet, $to:expr) => {
+    ($cfg:expr, $path:expr, Methods::ProtectGet, $to:expr) => {
         $cfg.service(
-            actix_web::web::resource($path)
-                .wrap(crate::CheckLogin)
-                .guard(actix_web::guard::Get())
+            actix_web::web::resource($path)
+                .wrap(crate::CheckLogin)
+                .guard(actix_web::guard::Get())
                 .to($to),
         );
     };
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/settings.rs.html b/src/mcaptcha/settings.rs.html index a886826c..bf294b87 100644 --- a/src/mcaptcha/settings.rs.html +++ b/src/mcaptcha/settings.rs.html @@ -1,7 +1,7 @@ -settings.rs - source +settings.rs - source -
  1
+
  1
   2
   3
   4
@@ -227,6 +227,8 @@
 224
 225
 226
+227
+228
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -244,13 +246,13 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::env;
-use std::path::Path;
+use std::env;
+use std::path::Path;
 
 use config::{Config, ConfigError, Environment, File};
-use log::debug;
-use serde::Deserialize;
-use url::Url;
+use log::debug;
+use serde::Deserialize;
+use url::Url;
 
 #[derive(Debug, Clone, Deserialize)]
 pub struct Server {
@@ -271,15 +273,17 @@
 #[derive(Debug, Clone, Deserialize)]
 pub struct Smtp {
     pub from: String,
+    pub reply_to: String,
     pub url: String,
     pub username: String,
     pub password: String,
+    pub port: u16,
 }
 
 impl Server {
     #[cfg(not(tarpaulin_include))]
     pub fn get_ip(&self) -> String {
-        format!("{}:{}", self.ip, self.port)
+        format!("{}:{}", self.ip, self.port)
     }
 }
 
@@ -296,7 +300,7 @@
 impl DatabaseBuilder {
     #[cfg(not(tarpaulin_include))]
     fn extract_database_url(url: &Url) -> Self {
-        debug!("Databse name: {}", url.path());
+        debug!("Databse name: {}", url.path());
         let mut path = url.path().split('/');
         path.next();
         let name = path.next().expect("no database name").to_string();
@@ -337,7 +341,7 @@
 #[cfg(not(tarpaulin_include))]
 impl Settings {
     pub fn new() -> Result<Self, ConfigError> {
-        let mut s = Config::new();
+        let mut s = Config::new();
 
         // setting default values
         #[cfg(test)]
@@ -347,42 +351,42 @@
         const CURRENT_DIR: &str = "./config/default.toml";
         const ETC: &str = "/etc/mcaptcha/config.toml";
 
-        if let Ok(path) = env::var("MCAPTCHA_CONFIG") {
-            s.merge(File::with_name(&path))?;
-        } else if Path::new(CURRENT_DIR).exists() {
+        if let Ok(path) = env::var("MCAPTCHA_CONFIG") {
+            s.merge(File::with_name(&path))?;
+        } else if Path::new(CURRENT_DIR).exists() {
             // merging default config from file
-            s.merge(File::with_name(CURRENT_DIR))?;
-        } else if Path::new(ETC).exists() {
-            s.merge(File::with_name(ETC))?;
+            s.merge(File::with_name(CURRENT_DIR))?;
+        } else if Path::new(ETC).exists() {
+            s.merge(File::with_name(ETC))?;
         } else {
-            log::warn!("configuration file not found");
+            log::warn!("configuration file not found");
         }
 
-        s.merge(Environment::with_prefix("MCAPTCHA").separator("_"))?;
+        s.merge(Environment::with_prefix("MCAPTCHA").separator("_"))?;
 
         check_url(&s);
 
-        match env::var("PORT") {
+        match env::var("PORT") {
             Ok(val) => {
                 s.set("server.port", val).unwrap();
             }
-            Err(e) => println!("couldn't interpret PORT: {}", e),
+            Err(e) => println!("couldn't interpret PORT: {}", e),
         }
 
-        match env::var("DATABASE_URL") {
+        match env::var("DATABASE_URL") {
             Ok(val) => {
-                let url = Url::parse(&val).expect("couldn't parse Database URL");
-                let database_conf = DatabaseBuilder::extract_database_url(&url);
+                let url = Url::parse(&val).expect("couldn't parse Database URL");
+                let database_conf = DatabaseBuilder::extract_database_url(&url);
                 set_from_database_url(&mut s, &database_conf);
             }
-            Err(e) => println!("couldn't interpret DATABASE_URL: {}", e),
+            Err(e) => println!("couldn't interpret DATABASE_URL: {}", e),
         }
 
         set_database_url(&mut s);
 
         match s.try_into() {
             Ok(val) => Ok(val),
-            Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))),
+            Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))),
         }
     }
 }
@@ -393,7 +397,7 @@
         .get::<String>("source_code")
         .expect("Couldn't access source_code");
 
-    Url::parse(&url).expect("Please enter a URL for source_code in settings");
+    Url::parse(&url).expect("Please enter a URL for source_code in settings");
 }
 
 #[cfg(not(tarpaulin_include))]
@@ -414,7 +418,7 @@
 fn set_database_url(s: &mut Config) {
     s.set(
         "database.url",
-        format!(
+        format!(
             r"postgres://{}:{}@{}:{}/{}",
             s.get::<String>("database.username")
                 .expect("Couldn't access database username"),
@@ -455,5 +459,5 @@
 //    }
 //}
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/static_assets/filemap.rs.html b/src/mcaptcha/static_assets/filemap.rs.html index 919c22e1..3d45e97a 100644 --- a/src/mcaptcha/static_assets/filemap.rs.html +++ b/src/mcaptcha/static_assets/filemap.rs.html @@ -1,7 +1,7 @@ -filemap.rs - source +filemap.rs - source -
 1
+
 1
  2
  3
  4
@@ -64,17 +64,17 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use cache_buster::Files;
+use cache_buster::Files;
 
 pub struct FileMap {
     pub files: Files,
 }
 
 impl FileMap {
-    #[allow(clippy::new_without_default)]
+    #[allow(clippy::new_without_default)]
     pub fn new() -> Self {
-        let map = include_str!("../cache_buster_data.json");
-        let files = Files::new(&map);
+        let map = include_str!("../cache_buster_data.json");
+        let files = Files::new(&map);
         Self { files }
     }
     pub fn get<'a>(&'a self, path: &'a str) -> Option<&'a str> {
@@ -88,12 +88,12 @@
 
     #[test]
     fn filemap_works() {
-        let files = super::FileMap::new();
+        let files = super::FileMap::new();
         let css = files.get("./static/cache/bundle/bundle.css").unwrap();
-        println!("{}", css);
-        assert!(css.contains("/assets/bundle/bundle"));
+        println!("{}", css);
+        assert!(css.contains("/assets/bundle/bundle"));
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/static_assets/mod.rs.html b/src/mcaptcha/static_assets/mod.rs.html index 8c93f37f..aebcc136 100644 --- a/src/mcaptcha/static_assets/mod.rs.html +++ b/src/mcaptcha/static_assets/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -48,12 +48,12 @@
 pub mod filemap;
 pub mod static_files;
 
-pub use filemap::FileMap;
+pub use filemap::FileMap;
 
-pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
-    cfg.service(static_files::static_files);
-    cfg.service(static_files::favicons);
+pub fn services(cfg: &mut actix_web::web::ServiceConfig) {
+    cfg.service(static_files::static_files);
+    cfg.service(static_files::favicons);
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/static_assets/static_files.rs.html b/src/mcaptcha/static_assets/static_files.rs.html index 69ae7e62..90059505 100644 --- a/src/mcaptcha/static_assets/static_files.rs.html +++ b/src/mcaptcha/static_assets/static_files.rs.html @@ -1,7 +1,7 @@ -static_files.rs - source +static_files.rs - source -
  1
+
  1
   2
   3
   4
@@ -171,44 +171,44 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::borrow::Cow;
+use std::borrow::Cow;
 
-use actix_web::body::Body;
-use actix_web::{get, http::header, web, HttpResponse, Responder};
-use log::debug;
-use mime_guess::from_path;
-use rust_embed::RustEmbed;
+use actix_web::body::Body;
+use actix_web::{get, http::header, web, HttpResponse, Responder};
+use log::debug;
+use mime_guess::from_path;
+use rust_embed::RustEmbed;
 
-use crate::CACHE_AGE;
+use crate::CACHE_AGE;
 
 #[derive(RustEmbed)]
 #[folder = "assets/"]
 struct Asset;
 
 fn handle_assets(path: &str) -> HttpResponse {
-    match Asset::get(path) {
+    match Asset::get(path) {
         Some(content) => {
             let body: Body = match content {
-                Cow::Borrowed(bytes) => bytes.into(),
-                Cow::Owned(bytes) => bytes.into(),
+                Cow::Borrowed(bytes) => bytes.into(),
+                Cow::Owned(bytes) => bytes.into(),
             };
 
-            HttpResponse::Ok()
-                .set(header::CacheControl(vec![
-                    header::CacheDirective::Public,
-                    header::CacheDirective::Extension("immutable".into(), None),
-                    header::CacheDirective::MaxAge(CACHE_AGE),
+            HttpResponse::Ok()
+                .insert_header(header::CacheControl(vec![
+                    header::CacheDirective::Public,
+                    header::CacheDirective::Extension("immutable".into(), None),
+                    header::CacheDirective::MaxAge(CACHE_AGE),
                 ]))
                 .content_type(from_path(path).first_or_octet_stream().as_ref())
                 .body(body)
         }
-        None => HttpResponse::NotFound().body("404 Not Found"),
+        None => HttpResponse::NotFound().body("404 Not Found"),
     }
 }
 
 #[get("/assets/{_:.*}")]
-pub async fn static_files(path: web::Path<String>) -> impl Responder {
-    handle_assets(&path.0)
+pub async fn static_files(path: web::Path<String>) -> impl Responder {
+    handle_assets(&path)
 }
 
 #[derive(RustEmbed)]
@@ -216,98 +216,98 @@
 struct Favicons;
 
 fn handle_favicons(path: &str) -> HttpResponse {
-    match Favicons::get(path) {
+    match Favicons::get(path) {
         Some(content) => {
             let body: Body = match content {
-                Cow::Borrowed(bytes) => bytes.into(),
-                Cow::Owned(bytes) => bytes.into(),
+                Cow::Borrowed(bytes) => bytes.into(),
+                Cow::Owned(bytes) => bytes.into(),
             };
 
-            HttpResponse::Ok()
-                .set(header::CacheControl(vec![
-                    header::CacheDirective::Public,
-                    header::CacheDirective::Extension("immutable".into(), None),
-                    header::CacheDirective::MaxAge(CACHE_AGE),
+            HttpResponse::Ok()
+                .insert_header(header::CacheControl(vec![
+                    header::CacheDirective::Public,
+                    header::CacheDirective::Extension("immutable".into(), None),
+                    header::CacheDirective::MaxAge(CACHE_AGE),
                 ]))
                 .content_type(from_path(path).first_or_octet_stream().as_ref())
                 .body(body)
         }
-        None => HttpResponse::NotFound().body("404 Not Found"),
+        None => HttpResponse::NotFound().body("404 Not Found"),
     }
 }
 
 #[get("/{file}")]
-pub async fn favicons(path: web::Path<String>) -> impl Responder {
-    debug!("searching favicons");
-    handle_favicons(&path.0)
+pub async fn favicons(path: web::Path<String>) -> impl Responder {
+    debug!("searching favicons");
+    handle_favicons(&path)
 }
 
 #[cfg(test)]
 mod tests {
-    use actix_web::http::StatusCode;
-    use actix_web::test;
+    use actix_web::http::StatusCode;
+    use actix_web::test;
 
     use super::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn static_assets_work() {
-        let mut app = get_app!().await;
+        let mut app = get_app!().await;
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get().uri(*crate::JS).to_request(),
+            test::TestRequest::get().uri(*crate::JS).to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
-                .uri(*crate::VERIFICATIN_WIDGET_JS)
+            test::TestRequest::get()
+                .uri(*crate::VERIFICATIN_WIDGET_JS)
                 .to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
-                .uri(*crate::VERIFICATIN_WIDGET_CSS)
+            test::TestRequest::get()
+                .uri(*crate::VERIFICATIN_WIDGET_CSS)
                 .to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get()
+            test::TestRequest::get()
                 .uri(
-                    crate::FILES
+                    crate::FILES
                         .get("./static/cache/img/icon-trans.png")
                         .unwrap(),
                 )
                 .to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
     }
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn favicons_work() {
-        assert!(Favicons::get("favicon.ico").is_some());
+        assert!(Favicons::get("favicon.ico").is_some());
 
         //let mut app = test::init_service(App::new().configure(services)).await;
-        let mut app = get_app!().await;
+        let mut app = get_app!().await;
 
-        let resp = test::call_service(
+        let resp = test::call_service(
             &mut app,
-            test::TestRequest::get().uri("/favicon.ico").to_request(),
+            test::TestRequest::get().uri("/favicon.ico").to_request(),
         )
         .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        assert_eq!(resp.status(), StatusCode::OK);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/stats/fetch.rs.html b/src/mcaptcha/stats/fetch.rs.html index 76e19776..b8010753 100644 --- a/src/mcaptcha/stats/fetch.rs.html +++ b/src/mcaptcha/stats/fetch.rs.html @@ -1,7 +1,7 @@ -fetch.rs - source +fetch.rs - source -
  1
+
  1
   2
   3
   4
@@ -172,9 +172,9 @@
 */
 
 use serde::{Deserialize, Serialize};
-use sqlx::PgPool;
+use sqlx::PgPool;
 
-use crate::errors::*;
+use crate::errors::*;
 
 #[derive(Debug, Clone, Deserialize, Serialize)]
 pub struct Stats {
@@ -185,12 +185,12 @@
 
 impl Stats {
     pub async fn new(key: &str, db: &PgPool) -> ServiceResult<Self> {
-        let config_fetches_fut = Self::fetch_config_fetched(key, db);
-        let solves_fut = Self::fetch_solve(key, db);
-        let confirms_fut = Self::fetch_confirm(key, db);
+        let config_fetches_fut = Self::fetch_config_fetched(key, db);
+        let solves_fut = Self::fetch_solve(key, db);
+        let confirms_fut = Self::fetch_confirm(key, db);
 
         let (config_fetches, solves, confirms) =
-            futures::try_join!(config_fetches_fut, solves_fut, confirms_fut)?;
+            futures::try_join!(config_fetches_fut, solves_fut, confirms_fut)?;
 
         let res = Self {
             config_fetches,
@@ -207,7 +207,7 @@
         key: &str,
         db: &PgPool,
     ) -> ServiceResult<Vec<i64>> {
-        let records = sqlx::query!(
+        let records = sqlx::query!(
             "SELECT fetched_at FROM mcaptcha_pow_fetched_stats WHERE config_id = 
         (SELECT config_id FROM mcaptcha_config where key = $1)",
             &key,
@@ -215,7 +215,7 @@
         .fetch_all(db)
         .await?;
 
-        let mut res: Vec<i64> = Vec::with_capacity(records.len());
+        let mut res: Vec<i64> = Vec::with_capacity(records.len());
 
         records
             .iter()
@@ -229,7 +229,7 @@
     pub async fn fetch_solve(key: &str, db: &PgPool) -> ServiceResult<Vec<i64>> {
         //    "SELECT solved_at FROM mcaptcha_pow_solved_stats WHERE config_id =
         //    (SELECT config_id FROM mcaptcha_config where key = $1)"
-        let records = sqlx::query!(
+        let records = sqlx::query!(
             "SELECT solved_at FROM mcaptcha_pow_solved_stats WHERE config_id = 
         (SELECT config_id FROM mcaptcha_config where key = $1)",
             &key,
@@ -237,7 +237,7 @@
         .fetch_all(db)
         .await?;
 
-        let mut res: Vec<i64> = Vec::with_capacity(records.len());
+        let mut res: Vec<i64> = Vec::with_capacity(records.len());
 
         records
             .iter()
@@ -249,7 +249,7 @@
     /// featch PoWConfig confirms
     #[inline]
     pub async fn fetch_confirm(key: &str, db: &PgPool) -> ServiceResult<Vec<i64>> {
-        let records = sqlx::query!(
+        let records = sqlx::query!(
             "SELECT confirmed_at FROM mcaptcha_pow_confirmed_stats WHERE config_id = (
         SELECT config_id FROM mcaptcha_config where key = $1)",
             &key
@@ -257,7 +257,7 @@
         .fetch_all(db)
         .await?;
 
-        let mut res: Vec<i64> = Vec::with_capacity(records.len());
+        let mut res: Vec<i64> = Vec::with_capacity(records.len());
 
         records
             .iter()
@@ -270,42 +270,42 @@
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::stats::record::*;
-    use crate::tests::*;
+    use crate::stats::record::*;
+    use crate::tests::*;
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn stats_works() {
         const NAME: &str = "statsuser";
         const PASSWORD: &str = "testingpas";
         const EMAIL: &str = "statsuser@a.com";
 
-        let data = Data::new().await;
+        let data = Data::new().await;
         delete_user(NAME, &data).await;
 
         register_and_signin(NAME, EMAIL, PASSWORD).await;
         let (_, _, _, token_key) = add_levels_util(NAME, PASSWORD).await;
         let key = token_key.key.clone();
 
-        let stats = Stats::new(&key, &data.db).await.unwrap();
+        let stats = Stats::new(&key, &data.db).await.unwrap();
 
-        assert_eq!(stats.config_fetches.len(), 0);
-        assert_eq!(stats.solves.len(), 0);
-        assert_eq!(stats.confirms.len(), 0);
+        assert_eq!(stats.config_fetches.len(), 0);
+        assert_eq!(stats.solves.len(), 0);
+        assert_eq!(stats.confirms.len(), 0);
 
-        futures::join!(
+        futures::join!(
             record_fetch(&key, &data.db),
             record_solve(&key, &data.db),
             record_confirm(&key, &data.db)
         );
 
-        let stats = Stats::new(&key, &data.db).await.unwrap();
+        let stats = Stats::new(&key, &data.db).await.unwrap();
 
-        assert_eq!(stats.config_fetches.len(), 1);
-        assert_eq!(stats.solves.len(), 1);
-        assert_eq!(stats.confirms.len(), 1);
+        assert_eq!(stats.config_fetches.len(), 1);
+        assert_eq!(stats.solves.len(), 1);
+        assert_eq!(stats.confirms.len(), 1);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/stats/mod.rs.html b/src/mcaptcha/stats/mod.rs.html index ff61ff17..35e8072a 100644 --- a/src/mcaptcha/stats/mod.rs.html +++ b/src/mcaptcha/stats/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
 1
+
 1
  2
  3
  4
@@ -41,5 +41,5 @@
 pub mod fetch;
 pub mod record;
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/stats/record.rs.html b/src/mcaptcha/stats/record.rs.html index 57a7a50d..4f6210f5 100644 --- a/src/mcaptcha/stats/record.rs.html +++ b/src/mcaptcha/stats/record.rs.html @@ -1,7 +1,7 @@ -record.rs - source +record.rs - source -
 1
+
 1
  2
  3
  4
@@ -73,12 +73,12 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-use sqlx::PgPool;
+use sqlx::PgPool;
 
 /// record PoWConfig fetches
 #[inline]
 pub async fn record_fetch(key: &str, db: &PgPool) {
-    let _ = sqlx::query!(
+    let _ = sqlx::query!(
         "INSERT INTO mcaptcha_pow_fetched_stats 
         (config_id) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1))",
         &key,
@@ -90,7 +90,7 @@
 /// record PoWConfig solves
 #[inline]
 pub async fn record_solve(key: &str, db: &PgPool) {
-    let _ = sqlx::query!(
+    let _ = sqlx::query!(
         "INSERT INTO mcaptcha_pow_solved_stats 
         (config_id) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1))",
         &key,
@@ -102,7 +102,7 @@
 /// record PoWConfig confirms
 #[inline]
 pub async fn record_confirm(key: &str, db: &PgPool) {
-    let _ = sqlx::query!(
+    let _ = sqlx::query!(
         "INSERT INTO mcaptcha_pow_confirmed_stats 
         (config_id) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1))",
         &key,
@@ -111,5 +111,5 @@
     .await;
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/mcaptcha/widget/mod.rs.html b/src/mcaptcha/widget/mod.rs.html index f6e7c417..1db9108b 100644 --- a/src/mcaptcha/widget/mod.rs.html +++ b/src/mcaptcha/widget/mod.rs.html @@ -1,7 +1,7 @@ -mod.rs - source +mod.rs - source -
  1
+
  1
   2
   3
   4
@@ -146,18 +146,18 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::borrow::Cow;
+use std::borrow::Cow;
 
-use actix_web::body::Body;
-use actix_web::{get, http::header, web, HttpResponse, Responder};
-use lazy_static::lazy_static;
-use mime_guess::from_path;
-use rust_embed::RustEmbed;
-use sailfish::TemplateOnce;
+use actix_web::body::Body;
+use actix_web::{get, http::header, web, HttpResponse, Responder};
+use lazy_static::lazy_static;
+use mime_guess::from_path;
+use rust_embed::RustEmbed;
+use sailfish::TemplateOnce;
 
-use crate::errors::*;
+use crate::errors::*;
 
-pub const WIDGET_ROUTES: routes::Widget = routes::Widget::new();
+pub const WIDGET_ROUTES: routes::Widget = routes::Widget::new();
 
 pub mod routes {
     pub struct Widget {
@@ -189,14 +189,14 @@
     }
 }
 
-lazy_static! {
-    static ref INDEX_PAGE: String = IndexPage::new().render_once().unwrap();
+lazy_static! {
+    static ref INDEX_PAGE: String = IndexPage::new().render_once().unwrap();
 }
 
 /// render a client side widget for CAPTCHA verification
-#[my_codegen::get(path = "crate::WIDGET_ROUTES.verification_widget")] //, wrap = "crate::CheckLogin")]
+#[my_codegen::get(path = "crate::WIDGET_ROUTES.verification_widget")] //, wrap = "crate::CheckLogin")]
 async fn show_widget() -> PageResult<impl Responder> {
-    Ok(HttpResponse::Ok()
+    Ok(HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(&*INDEX_PAGE))
 }
@@ -206,44 +206,44 @@
 struct WidgetAssets;
 
 fn handle_widget_assets(path: &str) -> HttpResponse {
-    match WidgetAssets::get(path) {
+    match WidgetAssets::get(path) {
         Some(content) => {
             let body: Body = match content {
-                Cow::Borrowed(bytes) => bytes.into(),
-                Cow::Owned(bytes) => bytes.into(),
+                Cow::Borrowed(bytes) => bytes.into(),
+                Cow::Owned(bytes) => bytes.into(),
             };
 
-            HttpResponse::Ok()
-                .set(header::CacheControl(vec![header::CacheDirective::MaxAge(
-                    crate::CACHE_AGE,
-                )]))
+            HttpResponse::Ok()
+                .insert_header(header::CacheControl(vec![
+                    header::CacheDirective::MaxAge(crate::CACHE_AGE),
+                ]))
                 .content_type(from_path(path).first_or_octet_stream().as_ref())
                 .body(body)
         }
-        None => HttpResponse::NotFound().body("404 Not Found"),
+        None => HttpResponse::NotFound().body("404 Not Found"),
     }
 }
 
 #[get("/widget/{_:.*}")]
-pub async fn widget_assets(path: web::Path<String>) -> impl Responder {
-    handle_widget_assets(&path.0)
+pub async fn widget_assets(path: web::Path<String>) -> impl Responder {
+    handle_widget_assets(&path)
 }
 
-pub fn services(cfg: &mut web::ServiceConfig) {
+pub fn services(cfg: &mut web::ServiceConfig) {
     cfg.service(show_widget);
     cfg.service(widget_assets);
 }
 
 #[cfg(test)]
 mod test {
-    use actix_web::http::StatusCode;
-    use actix_web::test;
+    use actix_web::http::StatusCode;
+    use actix_web::test;
 
     use crate::*;
 
-    #[actix_rt::test]
+    #[actix_rt::test]
     async fn captcha_widget_route_works() {
-        let mut app = get_app!().await;
+        let mut app = get_app!().await;
         //            let list_sitekey_resp = test::call_service(
         //                    &mut app,
         //                    test::TestRequest::get()
@@ -253,11 +253,11 @@
         //            .await;
         //            assert_eq!(list_sitekey_resp.status(), StatusCode::OK);
 
-        get_works!(app, crate::WIDGET_ROUTES.verification_widget);
-        get_works!(app, crate::WIDGET_ROUTES.js);
-        get_works!(app, crate::WIDGET_ROUTES.wasm);
+        get_works!(app, crate::WIDGET_ROUTES.verification_widget);
+        get_works!(app, crate::WIDGET_ROUTES.js);
+        get_works!(app, crate::WIDGET_ROUTES.wasm);
     }
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/tests_migrate/data.rs.html b/src/tests_migrate/data.rs.html index d1dfc47f..a1014a67 100644 --- a/src/tests_migrate/data.rs.html +++ b/src/tests_migrate/data.rs.html @@ -1,7 +1,7 @@ -data.rs - source +data.rs - source -
  1
+
  1
   2
   3
   4
@@ -193,6 +193,18 @@
 190
 191
 192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -211,33 +223,34 @@
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 //! App data: redis cache, database connections, etc.
-use std::sync::Arc;
+use std::sync::Arc;
 
-use actix::prelude::*;
+use actix::prelude::*;
 use argon2_creds::{Config, ConfigBuilder, PasswordPolicy};
+use lettre::transport::smtp::authentication::Mechanism;
 use lettre::{
-    transport::smtp::authentication::Credentials, AsyncSmtpTransport, Tokio1Executor,
+    transport::smtp::authentication::Credentials, AsyncSmtpTransport, Tokio1Executor,
 };
-use libmcaptcha::cache::hashcache::HashCache;
-use libmcaptcha::cache::redis::RedisCache;
-use libmcaptcha::master::redis::master::Master as RedisMaster;
-use libmcaptcha::redis::RedisConfig;
+use libmcaptcha::cache::hashcache::HashCache;
+use libmcaptcha::cache::redis::RedisCache;
+use libmcaptcha::master::redis::master::Master as RedisMaster;
+use libmcaptcha::redis::RedisConfig;
 use libmcaptcha::{
-    cache::messages::VerifyCaptchaResult,
-    cache::Save,
-    errors::CaptchaResult,
-    master::{embedded::master::Master as EmbeddedMaster, Master as MasterTrait},
-    pow::ConfigBuilder as PoWConfigBuilder,
-    pow::PoWConfig,
-    pow::Work,
+    cache::messages::VerifyCaptchaResult,
+    cache::Save,
+    errors::CaptchaResult,
+    master::{embedded::master::Master as EmbeddedMaster, Master as MasterTrait},
+    pow::ConfigBuilder as PoWConfigBuilder,
+    pow::PoWConfig,
+    pow::Work,
     system::{System, SystemBuilder},
     //    master::messages::AddSite,
 };
 
-use sqlx::postgres::PgPoolOptions;
-use sqlx::PgPool;
+use sqlx::postgres::PgPoolOptions;
+use sqlx::PgPool;
 
-use crate::SETTINGS;
+use crate::SETTINGS;
 
 /// Represents mCaptcha cache and master system.
 /// When Redis is configured, [SystemGroup::Redis] is used and
@@ -251,16 +264,16 @@
     /// utility function to get difficulty factor of site `id` and cache it
     pub async fn get_pow(&self, id: String) -> Option<PoWConfig> {
         match self {
-            Self::Embedded(val) => val.get_pow(id).await,
-            Self::Redis(val) => val.get_pow(id).await,
+            Self::Embedded(val) => val.get_pow(id).await,
+            Self::Redis(val) => val.get_pow(id).await,
         }
     }
 
     /// utility function to verify [Work]
     pub async fn verify_pow(&self, work: Work) -> CaptchaResult<String> {
         match self {
-            Self::Embedded(val) => val.verify_pow(work).await,
-            Self::Redis(val) => val.verify_pow(work).await,
+            Self::Embedded(val) => val.verify_pow(work).await,
+            Self::Redis(val) => val.verify_pow(work).await,
         }
     }
 
@@ -270,8 +283,8 @@
         msg: VerifyCaptchaResult,
     ) -> CaptchaResult<bool> {
         match self {
-            Self::Embedded(val) => val.validate_verification_tokens(msg).await,
-            Self::Redis(val) => val.validate_verification_tokens(msg).await,
+            Self::Embedded(val) => val.validate_verification_tokens(msg).await,
+            Self::Redis(val) => val.validate_verification_tokens(msg).await,
         }
     }
 
@@ -288,12 +301,12 @@
     //        }
 
     fn new_system<A: Save, B: MasterTrait>(m: Addr<B>, c: Addr<A>) -> System<A, B> {
-        let pow = PoWConfigBuilder::default()
+        let pow = PoWConfigBuilder::default()
             .salt(SETTINGS.pow.salt.clone())
             .build()
             .unwrap();
 
-        SystemBuilder::default().pow(pow).cache(c).master(m).build()
+        SystemBuilder::default().pow(pow).cache(c).master(m).build()
     }
 
     // read settings, if Redis is configured then produce a Redis mCaptcha cache
@@ -301,24 +314,24 @@
     async fn new() -> Self {
         match &SETTINGS.redis {
             Some(val) => {
-                let master = RedisMaster::new(RedisConfig::Single(val.url.clone()))
+                let master = RedisMaster::new(RedisConfig::Single(val.url.clone()))
                     .await
                     .unwrap()
                     .start();
-                let cache = RedisCache::new(RedisConfig::Single(val.url.clone()))
+                let cache = RedisCache::new(RedisConfig::Single(val.url.clone()))
                     .await
                     .unwrap()
                     .start();
-                let captcha = Self::new_system(master, cache);
+                let captcha = Self::new_system(master, cache);
 
-                SystemGroup::Redis(captcha)
+                SystemGroup::Redis(captcha)
             }
             None => {
-                let master = EmbeddedMaster::new(SETTINGS.pow.gc).start();
-                let cache = HashCache::default().start();
-                let captcha = Self::new_system(master, cache);
+                let master = EmbeddedMaster::new(SETTINGS.pow.gc).start();
+                let cache = HashCache::default().start();
+                let captcha = Self::new_system(master, cache);
 
-                SystemGroup::Embedded(captcha)
+                SystemGroup::Embedded(captcha)
             }
         }
     }
@@ -340,43 +353,54 @@
     #[cfg(not(tarpaulin_include))]
     /// create new instance of app data
     pub async fn new() -> Arc<Self> {
-        let db = PgPoolOptions::new()
+        let db = PgPoolOptions::new()
             .max_connections(SETTINGS.database.pool)
             .connect(&SETTINGS.database.url)
             .await
             .expect("Unable to form database pool");
 
-        let creds = ConfigBuilder::default()
+        let creds = ConfigBuilder::default()
             .username_case_mapped(true)
             .profanity(true)
             .blacklist(true)
-            .password_policy(PasswordPolicy::default())
+            .password_policy(PasswordPolicy::default())
             .build()
             .unwrap();
 
-        log::info!("Initializing credential manager");
-        creds.init();
-        log::info!("Initialized credential manager");
+        log::info!("Initializing credential manager");
+        //creds.init();
+        log::info!("Initialized credential manager");
 
         let data = Data {
             creds,
             db,
-            captcha: SystemGroup::new().await,
-            mailer: Self::get_mailer(),
+            captcha: SystemGroup::new().await,
+            mailer: Self::get_mailer(),
         };
 
-        Arc::new(data)
+        Arc::new(data)
     }
 
     fn get_mailer() -> Option<Mailer> {
         if let Some(smtp) = SETTINGS.smtp.as_ref() {
             let creds =
-                Credentials::new(smtp.username.to_string(), smtp.password.to_string()); // "smtp_username".to_string(), "smtp_password".to_string());
+                Credentials::new(smtp.username.to_string(), smtp.password.to_string()); // "smtp_username".to_string(), "smtp_password".to_string());
 
-            let mailer: Mailer = AsyncSmtpTransport::<Tokio1Executor>::relay(&smtp.url) //"smtp.gmail.com")
-                .unwrap()
-                .credentials(creds)
-                .build();
+            let mailer: Mailer =
+                AsyncSmtpTransport::<Tokio1Executor>::builder_dangerous(&smtp.url)
+                    .port(smtp.port)
+                    .credentials(creds)
+                    .authentication(vec![
+                        Mechanism::Login,
+                        Mechanism::Xoauth2,
+                        Mechanism::Plain,
+                    ])
+                    .build();
+
+            //            let mailer: Mailer = AsyncSmtpTransport::<Tokio1Executor>::relay(&smtp.url) //"smtp.gmail.com")
+            //                .unwrap()
+            //                .credentials(creds)
+            //                .build();
             Some(mailer)
         } else {
             None
@@ -387,5 +411,5 @@
 /// Mailer data type AsyncSmtpTransport<Tokio1Executor>
 pub type Mailer = AsyncSmtpTransport<Tokio1Executor>;
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/tests_migrate/settings.rs.html b/src/tests_migrate/settings.rs.html index bc61c1be..f833eccd 100644 --- a/src/tests_migrate/settings.rs.html +++ b/src/tests_migrate/settings.rs.html @@ -1,7 +1,7 @@ -settings.rs - source +settings.rs - source -
  1
+
  1
   2
   3
   4
@@ -227,6 +227,8 @@
 224
 225
 226
+227
+228
 
 /*
 * Copyright (C) 2021  Aravinth Manivannan <realaravinth@batsense.net>
@@ -244,13 +246,13 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::env;
-use std::path::Path;
+use std::env;
+use std::path::Path;
 
 use config::{Config, ConfigError, Environment, File};
-use log::debug;
-use serde::Deserialize;
-use url::Url;
+use log::debug;
+use serde::Deserialize;
+use url::Url;
 
 #[derive(Debug, Clone, Deserialize)]
 pub struct Server {
@@ -271,15 +273,17 @@
 #[derive(Debug, Clone, Deserialize)]
 pub struct Smtp {
     pub from: String,
+    pub reply_to: String,
     pub url: String,
     pub username: String,
     pub password: String,
+    pub port: u16,
 }
 
 impl Server {
     #[cfg(not(tarpaulin_include))]
     pub fn get_ip(&self) -> String {
-        format!("{}:{}", self.ip, self.port)
+        format!("{}:{}", self.ip, self.port)
     }
 }
 
@@ -296,7 +300,7 @@
 impl DatabaseBuilder {
     #[cfg(not(tarpaulin_include))]
     fn extract_database_url(url: &Url) -> Self {
-        debug!("Databse name: {}", url.path());
+        debug!("Databse name: {}", url.path());
         let mut path = url.path().split('/');
         path.next();
         let name = path.next().expect("no database name").to_string();
@@ -337,7 +341,7 @@
 #[cfg(not(tarpaulin_include))]
 impl Settings {
     pub fn new() -> Result<Self, ConfigError> {
-        let mut s = Config::new();
+        let mut s = Config::new();
 
         // setting default values
         #[cfg(test)]
@@ -347,42 +351,42 @@
         const CURRENT_DIR: &str = "./config/default.toml";
         const ETC: &str = "/etc/mcaptcha/config.toml";
 
-        if let Ok(path) = env::var("MCAPTCHA_CONFIG") {
-            s.merge(File::with_name(&path))?;
-        } else if Path::new(CURRENT_DIR).exists() {
+        if let Ok(path) = env::var("MCAPTCHA_CONFIG") {
+            s.merge(File::with_name(&path))?;
+        } else if Path::new(CURRENT_DIR).exists() {
             // merging default config from file
-            s.merge(File::with_name(CURRENT_DIR))?;
-        } else if Path::new(ETC).exists() {
-            s.merge(File::with_name(ETC))?;
+            s.merge(File::with_name(CURRENT_DIR))?;
+        } else if Path::new(ETC).exists() {
+            s.merge(File::with_name(ETC))?;
         } else {
-            log::warn!("configuration file not found");
+            log::warn!("configuration file not found");
         }
 
-        s.merge(Environment::with_prefix("MCAPTCHA").separator("_"))?;
+        s.merge(Environment::with_prefix("MCAPTCHA").separator("_"))?;
 
         check_url(&s);
 
-        match env::var("PORT") {
+        match env::var("PORT") {
             Ok(val) => {
                 s.set("server.port", val).unwrap();
             }
-            Err(e) => println!("couldn't interpret PORT: {}", e),
+            Err(e) => println!("couldn't interpret PORT: {}", e),
         }
 
-        match env::var("DATABASE_URL") {
+        match env::var("DATABASE_URL") {
             Ok(val) => {
-                let url = Url::parse(&val).expect("couldn't parse Database URL");
-                let database_conf = DatabaseBuilder::extract_database_url(&url);
+                let url = Url::parse(&val).expect("couldn't parse Database URL");
+                let database_conf = DatabaseBuilder::extract_database_url(&url);
                 set_from_database_url(&mut s, &database_conf);
             }
-            Err(e) => println!("couldn't interpret DATABASE_URL: {}", e),
+            Err(e) => println!("couldn't interpret DATABASE_URL: {}", e),
         }
 
         set_database_url(&mut s);
 
         match s.try_into() {
             Ok(val) => Ok(val),
-            Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))),
+            Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))),
         }
     }
 }
@@ -393,7 +397,7 @@
         .get::<String>("source_code")
         .expect("Couldn't access source_code");
 
-    Url::parse(&url).expect("Please enter a URL for source_code in settings");
+    Url::parse(&url).expect("Please enter a URL for source_code in settings");
 }
 
 #[cfg(not(tarpaulin_include))]
@@ -414,7 +418,7 @@
 fn set_database_url(s: &mut Config) {
     s.set(
         "database.url",
-        format!(
+        format!(
             r"postgres://{}:{}@{}:{}/{}",
             s.get::<String>("database.username")
                 .expect("Couldn't access database username"),
@@ -455,5 +459,5 @@
 //    }
 //}
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/src/tests_migrate/tests-migrate.rs.html b/src/tests_migrate/tests-migrate.rs.html index 64c1e117..05a12382 100644 --- a/src/tests_migrate/tests-migrate.rs.html +++ b/src/tests_migrate/tests-migrate.rs.html @@ -1,7 +1,7 @@ -tests-migrate.rs - source +tests-migrate.rs - source -
 1
+
 1
  2
  3
  4
@@ -107,69 +107,69 @@
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
-use std::env;
+use std::env;
 
-use lazy_static::lazy_static;
+use lazy_static::lazy_static;
 
 mod data;
 mod settings;
 
-pub use data::Data;
-pub use settings::Settings;
+pub use data::Data;
+pub use settings::Settings;
 
 #[cfg(not(tarpaulin_include))]
-lazy_static! {
+lazy_static! {
     #[cfg(not(tarpaulin_include))]
-    pub static ref SETTINGS: Settings = Settings::new().unwrap();
+    pub static ref SETTINGS: Settings = Settings::new().unwrap();
 }
 
 #[cfg(not(tarpaulin_include))]
-#[actix_rt::main]
+#[actix_rt::main]
 async fn main() {
-    let data = Data::new().await;
+    let data = Data::new().await;
 
-    for arg in env::args() {
+    for arg in env::args() {
         if arg == "--build" {
-            println!("Building cache buster config");
+            println!("Building cache buster config");
             build();
         }
     }
 
-    sqlx::migrate!("./migrations/").run(&data.db).await.unwrap();
+    sqlx::migrate!("./migrations/").run(&data.db).await.unwrap();
 }
 
 fn build() {
-    use std::process::Command;
+    use std::process::Command;
 
     // note: add error checking yourself.
-    let output = Command::new("git")
+    let output = Command::new("git")
         .args(&["rev-parse", "HEAD"])
         .output()
         .unwrap();
-    let git_hash = String::from_utf8(output.stdout).unwrap();
-    println!("cargo:rustc-env=GIT_HASH={}", git_hash);
+    let git_hash = String::from_utf8(output.stdout).unwrap();
+    println!("cargo:rustc-env=GIT_HASH={}", git_hash);
 
-    let yml = include_str!("../openapi.yaml");
-    let api_json: serde_json::Value = serde_yaml::from_str(yml).unwrap();
-    println!(
+    let yml = include_str!("../openapi.yaml");
+    let api_json: serde_json::Value = serde_yaml::from_str(yml).unwrap();
+    println!(
         "cargo:rustc-env=OPEN_API_DOCS={}",
-        serde_json::to_string(&api_json).unwrap()
+        serde_json::to_string(&api_json).unwrap()
     );
     cache_bust();
 }
 
 fn cache_bust() {
-    use cache_buster::BusterBuilder;
-    let types = vec![
-        mime::IMAGE_PNG,
-        mime::IMAGE_SVG,
-        mime::IMAGE_JPEG,
-        mime::IMAGE_GIF,
-        mime::APPLICATION_JAVASCRIPT,
-        mime::TEXT_CSS,
+    use cache_buster::BusterBuilder;
+    let types = vec![
+        mime::IMAGE_PNG,
+        mime::IMAGE_SVG,
+        mime::IMAGE_JPEG,
+        mime::IMAGE_GIF,
+        mime::APPLICATION_JAVASCRIPT,
+        mime::TEXT_CSS,
     ];
 
-    let config = BusterBuilder::default()
+    let config = BusterBuilder::default()
         .source("./static/cache")
         .result("./assets")
         .mime_types(types)
@@ -181,5 +181,5 @@
     config.process().unwrap();
 }
 
-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/storage.js b/storage.js index ff361c66..9a98fff0 100644 --- a/storage.js +++ b/storage.js @@ -1 +1 @@ -var resourcesSuffix="";var darkThemes=["dark","ayu"];var currentTheme=document.getElementById("themeStyle");var mainTheme=document.getElementById("mainThemeStyle");var settingsDataset=(function(){var settingsElement=document.getElementById("default-settings");if(settingsElement===null){return null}var dataset=settingsElement.dataset;if(dataset===undefined){return null}return dataset})();function getSettingValue(settingName){var current=getCurrentValue('rustdoc-'+settingName);if(current!==null){return current}if(settingsDataset!==null){var def=settingsDataset[settingName.replace(/-/g,'_')];if(def!==undefined){return def}}return null}var localStoredTheme=getSettingValue("theme");var savedHref=[];function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(!elem||!elem.classList){return}elem.classList.add(className)}function removeClass(elem,className){if(!elem||!elem.classList){return}elem.classList.remove(className)}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){var length=arr.length;var i;if(reversed!==true){for(i=0;i=0;--i){if(func(arr[i])===true){return true}}}}return false}function onEachLazy(lazyArray,func,reversed){return onEach(Array.prototype.slice.call(lazyArray),func,reversed)}function hasOwnProperty(obj,property){return Object.prototype.hasOwnProperty.call(obj,property)}function usableLocalStorage(){if(typeof Storage==="undefined"){return false}try{return window.localStorage!==null&&window.localStorage!==undefined}catch(err){return false}}function updateLocalStorage(name,value){if(usableLocalStorage()){localStorage[name]=value}else{}}function getCurrentValue(name){if(usableLocalStorage()&&localStorage[name]!==undefined){return localStorage[name]}return null}function switchTheme(styleElem,mainStyleElem,newTheme,saveTheme){var fullBasicCss="rustdoc"+resourcesSuffix+".css";var fullNewTheme=newTheme+resourcesSuffix+".css";var newHref=mainStyleElem.href.replace(fullBasicCss,fullNewTheme);if(saveTheme===true){updateLocalStorage("rustdoc-theme",newTheme)}if(styleElem.href===newHref){return}var found=false;if(savedHref.length===0){onEachLazy(document.getElementsByTagName("link"),function(el){savedHref.push(el.href)})}onEach(savedHref,function(el){if(el===newHref){found=true;return true}});if(found===true){styleElem.href=newHref}}function useSystemTheme(value){if(value===undefined){value=true}updateLocalStorage("rustdoc-use-system-theme",value);var toggle=document.getElementById("use-system-theme");if(toggle&&toggle instanceof HTMLInputElement){toggle.checked=value}}var updateSystemTheme=(function(){if(!window.matchMedia){return function(){let cssTheme=getComputedStyle(document.documentElement).getPropertyValue('content');switchTheme(currentTheme,mainTheme,JSON.parse(cssTheme)||"light",true)}}var mql=window.matchMedia("(prefers-color-scheme: dark)");function handlePreferenceChange(mql){if(getSettingValue("use-system-theme")!=="false"){var lightTheme=getSettingValue("preferred-light-theme")||"light";var darkTheme=getSettingValue("preferred-dark-theme")||"dark";if(mql.matches){switchTheme(currentTheme,mainTheme,darkTheme,true)}else{switchTheme(currentTheme,mainTheme,lightTheme,true)}}}mql.addListener(handlePreferenceChange);return function(){handlePreferenceChange(mql)}})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("rustdoc-preferred-dark-theme",localStoredTheme)}updateSystemTheme()}else{switchTheme(currentTheme,mainTheme,getSettingValue("theme")||"light",false)} \ No newline at end of file +var resourcesSuffix="";var darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");window.mainTheme=document.getElementById("mainThemeStyle");var settingsDataset=(function(){var settingsElement=document.getElementById("default-settings");if(settingsElement===null){return null}var dataset=settingsElement.dataset;if(dataset===undefined){return null}return dataset})();function getSettingValue(settingName){var current=getCurrentValue('rustdoc-'+settingName);if(current!==null){return current}if(settingsDataset!==null){var def=settingsDataset[settingName.replace(/-/g,'_')];if(def!==undefined){return def}}return null}var localStoredTheme=getSettingValue("theme");var savedHref=[];function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(!elem||!elem.classList){return}elem.classList.add(className)}function removeClass(elem,className){if(!elem||!elem.classList){return}elem.classList.remove(className)}function onEach(arr,func,reversed){if(arr&&arr.length>0&&func){var length=arr.length;var i;if(reversed!==true){for(i=0;i=0;--i){if(func(arr[i])===true){return true}}}}return false}function onEachLazy(lazyArray,func,reversed){return onEach(Array.prototype.slice.call(lazyArray),func,reversed)}function hasOwnProperty(obj,property){return Object.prototype.hasOwnProperty.call(obj,property)}function updateLocalStorage(name,value){try{window.localStorage.setItem(name,value)}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem(name)}catch(e){return null}}function switchTheme(styleElem,mainStyleElem,newTheme,saveTheme){var fullBasicCss="rustdoc"+resourcesSuffix+".css";var fullNewTheme=newTheme+resourcesSuffix+".css";var newHref=mainStyleElem.href.replace(fullBasicCss,fullNewTheme);if(saveTheme===true){updateLocalStorage("rustdoc-theme",newTheme)}if(styleElem.href===newHref){return}var found=false;if(savedHref.length===0){onEachLazy(document.getElementsByTagName("link"),function(el){savedHref.push(el.href)})}onEach(savedHref,function(el){if(el===newHref){found=true;return true}});if(found===true){styleElem.href=newHref}}function useSystemTheme(value){if(value===undefined){value=true}updateLocalStorage("rustdoc-use-system-theme",value);var toggle=document.getElementById("use-system-theme");if(toggle&&toggle instanceof HTMLInputElement){toggle.checked=value}}var updateSystemTheme=(function(){if(!window.matchMedia){return function(){var cssTheme=getComputedStyle(document.documentElement).getPropertyValue('content');switchTheme(window.currentTheme,window.mainTheme,JSON.parse(cssTheme)||"light",true)}}var mql=window.matchMedia("(prefers-color-scheme: dark)");function handlePreferenceChange(mql){if(getSettingValue("use-system-theme")!=="false"){var lightTheme=getSettingValue("preferred-light-theme")||"light";var darkTheme=getSettingValue("preferred-dark-theme")||"dark";if(mql.matches){switchTheme(window.currentTheme,window.mainTheme,darkTheme,true)}else{switchTheme(window.currentTheme,window.mainTheme,lightTheme,true)}}}mql.addListener(handlePreferenceChange);return function(){handlePreferenceChange(mql)}})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("rustdoc-preferred-dark-theme",localStoredTheme)}updateSystemTheme()}else{switchTheme(window.currentTheme,window.mainTheme,getSettingValue("theme")||"light",false)} \ No newline at end of file diff --git a/tests_migrate/all.html b/tests_migrate/all.html index 8f68e937..a69ca1ca 100644 --- a/tests_migrate/all.html +++ b/tests_migrate/all.html @@ -1,7 +1,7 @@ -List of all items in this crate +List of all items in this crate -

List of all items[] +

List of all items[] -

Structs

Enums

Functions

Typedefs

- \ No newline at end of file +

Structs

Enums

Functions

Typedefs

+ \ No newline at end of file diff --git a/tests_migrate/data/enum.SystemGroup.html b/tests_migrate/data/enum.SystemGroup.html index 0a1af17b..a94e5413 100644 --- a/tests_migrate/data/enum.SystemGroup.html +++ b/tests_migrate/data/enum.SystemGroup.html @@ -1,123 +1,115 @@ -tests_migrate::data::SystemGroup - Rust +SystemGroup in tests_migrate::data - Rust -

Enum tests_migrate::data::SystemGroup[][src]

pub enum SystemGroup {
+

Enum tests_migrate::data::SystemGroup[][src]

pub enum SystemGroup {
     Embedded(System<HashCache, EmbeddedMaster>),
     Redis(System<RedisCache, RedisMaster>),
 }

Represents mCaptcha cache and master system. -When Redis is configured, SystemGroup::Redis is used and -in its absense, SystemGroup::Embedded is used

+When Redis is configured, SystemGroup::Redis is used and +in its absense, SystemGroup::Embedded is used

Variants

-
Embedded(System<HashCache, EmbeddedMaster>)
Redis(System<RedisCache, RedisMaster>)

Implementations

impl SystemGroup[src]

pub async fn get_pow(&self, id: String) -> Option<PoWConfig>[src]

utility function to get difficulty factor of site id and cache it

-

pub async fn verify_pow(&self, work: Work) -> CaptchaResult<String>[src]

utility function to verify [Work]

-

pub async fn validate_verification_tokens(
    &self,
    msg: VerifyCaptchaResult
) -> CaptchaResult<bool>
[src]

utility function to validate verification tokens

-

fn new_system<A: Save, B: MasterTrait>(m: Addr<B>, c: Addr<A>) -> System<A, B>[src]

async fn new() -> Self[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/tests_migrate/data/index.html b/tests_migrate/data/index.html index fa162397..1706a0bf 100644 --- a/tests_migrate/data/index.html +++ b/tests_migrate/data/index.html @@ -1,14 +1,14 @@ -tests_migrate::data - Rust +tests_migrate::data - Rust -

Module tests_migrate::data[][src]

App data: redis cache, database connections, etc.

+

Module tests_migrate::data[][src]

App data: redis cache, database connections, etc.

Structs

Data

App data

Enums

SystemGroup

Represents mCaptcha cache and master system. -When Redis is configured, SystemGroup::Redis is used and -in its absense, SystemGroup::Embedded is used

+When Redis is configured, SystemGroup::Redis is used and +in its absense, SystemGroup::Embedded is used

Type Definitions

Mailer

Mailer data type AsyncSmtpTransport

-
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/tests_migrate/data/struct.Data.html b/tests_migrate/data/struct.Data.html index b45bd8e4..73e460fe 100644 --- a/tests_migrate/data/struct.Data.html +++ b/tests_migrate/data/struct.Data.html @@ -1,124 +1,116 @@ -tests_migrate::data::Data - Rust +Data in tests_migrate::data - Rust -

Struct tests_migrate::data::Data[][src]

pub struct Data {
+

Struct tests_migrate::data::Data[][src]

pub struct Data {
     pub db: PgPool,
     pub creds: Config,
-    pub captcha: SystemGroup,
+    pub captcha: SystemGroup,
     pub mailer: Option<AsyncSmtpTransport<Tokio1Executor>>,
 }

App data

Fields

db: PgPool

databse pool

creds: Config

credential management configuration

-
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

+
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

mailer: Option<AsyncSmtpTransport<Tokio1Executor>>

email client

-

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

-

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

+

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

impl !RefUnwindSafe for Data

impl Send for Data

impl Sync for Data

impl Unpin for Data

impl !UnwindSafe for Data

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/tests_migrate/data/type.Mailer.html b/tests_migrate/data/type.Mailer.html index abef22a0..45c34e7b 100644 --- a/tests_migrate/data/type.Mailer.html +++ b/tests_migrate/data/type.Mailer.html @@ -1,6 +1,6 @@ -tests_migrate::data::Mailer - Rust +Mailer in tests_migrate::data - Rust -

Type Definition tests_migrate::data::Mailer[][src]

type Mailer = AsyncSmtpTransport<Tokio1Executor>;

Mailer data type AsyncSmtpTransport

-
- \ No newline at end of file +

Type Definition tests_migrate::data::Mailer[][src]

type Mailer = AsyncSmtpTransport<Tokio1Executor>;

Mailer data type AsyncSmtpTransport

+
+ \ No newline at end of file diff --git a/tests_migrate/fn.build.html b/tests_migrate/fn.build.html index 9b967c36..8bcfaded 100644 --- a/tests_migrate/fn.build.html +++ b/tests_migrate/fn.build.html @@ -1,5 +1,5 @@ -tests_migrate::build - Rust +build in tests_migrate - Rust -

Function tests_migrate::build[][src]

pub(crate) fn build()
- \ No newline at end of file +

Function tests_migrate::build[][src]

pub(crate) fn build()
+ \ No newline at end of file diff --git a/tests_migrate/fn.cache_bust.html b/tests_migrate/fn.cache_bust.html index 5907bfdc..c994c901 100644 --- a/tests_migrate/fn.cache_bust.html +++ b/tests_migrate/fn.cache_bust.html @@ -1,5 +1,5 @@ -tests_migrate::cache_bust - Rust +cache_bust in tests_migrate - Rust -

Function tests_migrate::cache_bust[][src]

pub(crate) fn cache_bust()
- \ No newline at end of file +

Function tests_migrate::cache_bust[][src]

pub(crate) fn cache_bust()
+ \ No newline at end of file diff --git a/tests_migrate/fn.main.html b/tests_migrate/fn.main.html index c352e5d8..bfe97d64 100644 --- a/tests_migrate/fn.main.html +++ b/tests_migrate/fn.main.html @@ -1,5 +1,5 @@ -tests_migrate::main - Rust +main in tests_migrate - Rust -

Function tests_migrate::main[][src]

pub(crate) fn main()
- \ No newline at end of file +

Function tests_migrate::main[][src]

pub(crate) fn main()
+ \ No newline at end of file diff --git a/tests_migrate/index.html b/tests_migrate/index.html index de67ba29..dceaec53 100644 --- a/tests_migrate/index.html +++ b/tests_migrate/index.html @@ -1,10 +1,10 @@ -tests_migrate - Rust +tests_migrate - Rust -

Crate tests_migrate[][src]

Modules

+

Crate tests_migrate[][src]

Modules

data

App data: redis cache, database connections, etc.

settings

Structs

Data

App data

SETTINGS
Settings

Functions

-
build
cache_bust
main
- \ No newline at end of file +
build
cache_bust
main
+ \ No newline at end of file diff --git a/tests_migrate/settings/fn.check_url.html b/tests_migrate/settings/fn.check_url.html index 8a4b4808..b09ea8ac 100644 --- a/tests_migrate/settings/fn.check_url.html +++ b/tests_migrate/settings/fn.check_url.html @@ -1,5 +1,5 @@ -tests_migrate::settings::check_url - Rust +check_url in tests_migrate::settings - Rust -

Function tests_migrate::settings::check_url[][src]

fn check_url(s: &Config)
- \ No newline at end of file +

Function tests_migrate::settings::check_url[][src]

fn check_url(s: &Config)
+ \ No newline at end of file diff --git a/tests_migrate/settings/fn.set_database_url.html b/tests_migrate/settings/fn.set_database_url.html index f6e51e63..a653dfb5 100644 --- a/tests_migrate/settings/fn.set_database_url.html +++ b/tests_migrate/settings/fn.set_database_url.html @@ -1,5 +1,5 @@ -tests_migrate::settings::set_database_url - Rust +set_database_url in tests_migrate::settings - Rust -

Function tests_migrate::settings::set_database_url[][src]

fn set_database_url(s: &mut Config)
- \ No newline at end of file +

Function tests_migrate::settings::set_database_url[][src]

fn set_database_url(s: &mut Config)
+ \ No newline at end of file diff --git a/tests_migrate/settings/fn.set_from_database_url.html b/tests_migrate/settings/fn.set_from_database_url.html index 06391675..ca68b498 100644 --- a/tests_migrate/settings/fn.set_from_database_url.html +++ b/tests_migrate/settings/fn.set_from_database_url.html @@ -1,5 +1,5 @@ -tests_migrate::settings::set_from_database_url - Rust +set_from_database_url in tests_migrate::settings - Rust -

Function tests_migrate::settings::set_from_database_url[][src]

fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder)
- \ No newline at end of file +

Function tests_migrate::settings::set_from_database_url[][src]

fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder)
+ \ No newline at end of file diff --git a/tests_migrate/settings/index.html b/tests_migrate/settings/index.html index 6dff684a..ea079d29 100644 --- a/tests_migrate/settings/index.html +++ b/tests_migrate/settings/index.html @@ -1,7 +1,7 @@ -tests_migrate::settings - Rust +tests_migrate::settings - Rust -

Module tests_migrate::settings[][src]

Structs

+

Module tests_migrate::settings[][src]

Structs

Captcha
Database
DatabaseBuilder
Redis
Server
Settings
Smtp

Functions

-
check_url
set_database_url
set_from_database_url
- \ No newline at end of file +
check_url
set_database_url
set_from_database_url
+ \ No newline at end of file diff --git a/tests_migrate/settings/struct.Captcha.html b/tests_migrate/settings/struct.Captcha.html index 8d7ab09c..39428c43 100644 --- a/tests_migrate/settings/struct.Captcha.html +++ b/tests_migrate/settings/struct.Captcha.html @@ -1,124 +1,116 @@ -tests_migrate::settings::Captcha - Rust +Captcha in tests_migrate::settings - Rust -

Struct tests_migrate::settings::Captcha[][src]

pub struct Captcha {
+

Struct tests_migrate::settings::Captcha[][src]

pub struct Captcha {
     pub salt: String,
     pub gc: u64,
 }

- Fields

salt: Stringgc: u64

Trait Implementations

impl Clone for Captcha[src]

impl Debug for Captcha[src]

impl<'de> Deserialize<'de> for Captcha[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/tests_migrate/settings/struct.Database.html b/tests_migrate/settings/struct.Database.html index e33dab12..f7fb6eaa 100644 --- a/tests_migrate/settings/struct.Database.html +++ b/tests_migrate/settings/struct.Database.html @@ -1,124 +1,116 @@ -tests_migrate::settings::Database - Rust +Database in tests_migrate::settings - Rust -

Struct tests_migrate::settings::Database[][src]

pub struct Database {
+

Struct tests_migrate::settings::Database[][src]

pub struct Database {
     pub url: String,
     pub pool: u32,
 }

- Fields

url: Stringpool: u32

Trait Implementations

impl Clone for Database[src]

impl Debug for Database[src]

impl<'de> Deserialize<'de> for Database[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/tests_migrate/settings/struct.DatabaseBuilder.html b/tests_migrate/settings/struct.DatabaseBuilder.html index 315509c0..3bdcb751 100644 --- a/tests_migrate/settings/struct.DatabaseBuilder.html +++ b/tests_migrate/settings/struct.DatabaseBuilder.html @@ -1,7 +1,7 @@ -tests_migrate::settings::DatabaseBuilder - Rust +DatabaseBuilder in tests_migrate::settings - Rust -

Struct tests_migrate::settings::DatabaseBuilder[][src]

struct DatabaseBuilder {
+

Struct tests_migrate::settings::DatabaseBuilder[][src]

struct DatabaseBuilder {
     pub port: u32,
     pub hostname: String,
     pub username: String,
@@ -9,120 +9,112 @@
     pub name: String,
     pub url: String,
 }

- Fields

port: u32hostname: Stringusername: Stringpassword: Stringname: Stringurl: String

Implementations

impl DatabaseBuilder[src]

fn extract_database_url(url: &Url) -> Self[src]

Trait Implementations

impl Clone for DatabaseBuilder[src]

impl Debug for DatabaseBuilder[src]

impl<'de> Deserialize<'de> for DatabaseBuilder[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/tests_migrate/settings/struct.Redis.html b/tests_migrate/settings/struct.Redis.html index f457274e..93451abf 100644 --- a/tests_migrate/settings/struct.Redis.html +++ b/tests_migrate/settings/struct.Redis.html @@ -1,124 +1,116 @@ -tests_migrate::settings::Redis - Rust +Redis in tests_migrate::settings - Rust -

Struct tests_migrate::settings::Redis[][src]

pub struct Redis {
+

Struct tests_migrate::settings::Redis[][src]

pub struct Redis {
     pub url: String,
     pub pool: u32,
 }

- Fields

url: Stringpool: u32

Trait Implementations

impl Clone for Redis[src]

impl Debug for Redis[src]

impl<'de> Deserialize<'de> for Redis[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/tests_migrate/settings/struct.Server.html b/tests_migrate/settings/struct.Server.html index e91069ac..2771ae94 100644 --- a/tests_migrate/settings/struct.Server.html +++ b/tests_migrate/settings/struct.Server.html @@ -1,7 +1,7 @@ -tests_migrate::settings::Server - Rust +Server in tests_migrate::settings - Rust -

Struct tests_migrate::settings::Server[][src]

pub struct Server {
+

Struct tests_migrate::settings::Server[][src]

pub struct Server {
     pub allow_registration: bool,
     pub port: u32,
     pub domain: String,
@@ -9,120 +9,112 @@
     pub ip: String,
     pub url_prefix: Option<String>,
 }

- Fields

allow_registration: boolport: u32domain: Stringcookie_secret: Stringip: Stringurl_prefix: Option<String>

Implementations

impl Server[src]

pub fn get_ip(&self) -> String[src]

Trait Implementations

impl Clone for Server[src]

impl Debug for Server[src]

impl<'de> Deserialize<'de> for Server[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/tests_migrate/settings/struct.Settings.html b/tests_migrate/settings/struct.Settings.html index 2cd9c51b..1792aee6 100644 --- a/tests_migrate/settings/struct.Settings.html +++ b/tests_migrate/settings/struct.Settings.html @@ -1,129 +1,121 @@ -tests_migrate::settings::Settings - Rust +Settings in tests_migrate::settings - Rust -

Struct tests_migrate::settings::Settings[][src]

pub struct Settings {
+

Struct tests_migrate::settings::Settings[][src]

pub struct Settings {
     pub debug: bool,
-    pub database: Database,
-    pub redis: Option<Redis>,
-    pub server: Server,
-    pub pow: Captcha,
+    pub database: Database,
+    pub redis: Option<Redis>,
+    pub server: Server,
+    pub pow: Captcha,
     pub source_code: String,
-    pub smtp: Option<Smtp>,
+    pub smtp: Option<Smtp>,
 }

- Fields

debug: booldatabase: Databaseredis: Option<Redis>server: Serverpow: Captchasource_code: Stringsmtp: Option<Smtp>

Implementations

impl Settings[src]

pub fn new() -> Result<Self, ConfigError>[src]

Trait Implementations

impl Clone for Settings[src]

impl Debug for Settings[src]

impl<'de> Deserialize<'de> for Settings[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/tests_migrate/settings/struct.Smtp.html b/tests_migrate/settings/struct.Smtp.html index f9f0632c..4e499a89 100644 --- a/tests_migrate/settings/struct.Smtp.html +++ b/tests_migrate/settings/struct.Smtp.html @@ -1,126 +1,120 @@ -tests_migrate::settings::Smtp - Rust +Smtp in tests_migrate::settings - Rust -

Struct tests_migrate::settings::Smtp[][src]

pub struct Smtp {
+

Struct tests_migrate::settings::Smtp[][src]

pub struct Smtp {
     pub from: String,
+    pub reply_to: String,
     pub url: String,
     pub username: String,
     pub password: String,
+    pub port: u16,
 }

- Fields

from: Stringurl: Stringusername: Stringpassword: String

Trait Implementations

impl Clone for Smtp[src]

impl Debug for Smtp[src]

impl<'de> Deserialize<'de> for Smtp[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/tests_migrate/struct.Data.html b/tests_migrate/struct.Data.html index 175519b6..8eca2733 100644 --- a/tests_migrate/struct.Data.html +++ b/tests_migrate/struct.Data.html @@ -1,124 +1,116 @@ -tests_migrate::Data - Rust +Data in tests_migrate - Rust -

Struct tests_migrate::Data[][src]

pub struct Data {
+

Struct tests_migrate::Data[][src]

pub struct Data {
     pub db: PgPool,
     pub creds: Config,
-    pub captcha: SystemGroup,
+    pub captcha: SystemGroup,
     pub mailer: Option<AsyncSmtpTransport<Tokio1Executor>>,
 }

App data

Fields

db: PgPool

databse pool

creds: Config

credential management configuration

-
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

+
captcha: SystemGroup

mCaptcha system: Redis cache, etc.

mailer: Option<AsyncSmtpTransport<Tokio1Executor>>

email client

-

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

-

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

Implementations

impl Data[src]

pub async fn new() -> Arc<Self>[src]

create new instance of app data

+

fn get_mailer() -> Option<AsyncSmtpTransport<Tokio1Executor>>[src]

Auto Trait Implementations

impl !RefUnwindSafe for Data

impl Send for Data

impl Sync for Data

impl Unpin for Data

impl !UnwindSafe for Data

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T> Instrument for T[src]

impl<T> Instrument for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> PipeRef for T

impl<T> Same<T> for T

type Output = T

Should always be Self

-

impl<T> Tap for T

impl<T> Same<T> for T

type Output = T

Should always be Self

+

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> TapDeref for T

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

-

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

-

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/tests_migrate/struct.SETTINGS.html b/tests_migrate/struct.SETTINGS.html index 87662676..c46b2824 100644 --- a/tests_migrate/struct.SETTINGS.html +++ b/tests_migrate/struct.SETTINGS.html @@ -1,117 +1,109 @@ -tests_migrate::SETTINGS - Rust +SETTINGS in tests_migrate - Rust -

Struct tests_migrate::SETTINGS[][src]

pub struct SETTINGS {
+

Struct tests_migrate::SETTINGS[][src]

pub struct SETTINGS {
     __private_field: (),
 }

- Fields

__private_field: ()

Methods from Deref<Target = Settings>

Trait Implementations

impl Deref for SETTINGS[src]

type Target = Settings

The resulting type after dereferencing.

-

impl LazyStatic for SETTINGS[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

+ \ No newline at end of file diff --git a/tests_migrate/struct.Settings.html b/tests_migrate/struct.Settings.html index effdb17b..455d94cd 100644 --- a/tests_migrate/struct.Settings.html +++ b/tests_migrate/struct.Settings.html @@ -1,129 +1,121 @@ -tests_migrate::Settings - Rust +Settings in tests_migrate - Rust -

Struct tests_migrate::Settings[][src]

pub struct Settings {
+

Struct tests_migrate::Settings[][src]

pub struct Settings {
     pub debug: bool,
-    pub database: Database,
-    pub redis: Option<Redis>,
-    pub server: Server,
-    pub pow: Captcha,
+    pub database: Database,
+    pub redis: Option<Redis>,
+    pub server: Server,
+    pub pow: Captcha,
     pub source_code: String,
-    pub smtp: Option<Smtp>,
+    pub smtp: Option<Smtp>,
 }

- Fields

debug: booldatabase: Databaseredis: Option<Redis>server: Serverpow: Captchasource_code: Stringsmtp: Option<Smtp>

Implementations

impl Settings[src]

pub fn new() -> Result<Self, ConfigError>[src]

Trait Implementations

impl Clone for Settings[src]

impl Debug for Settings[src]

impl<'de> Deserialize<'de> for Settings[src]

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> FmtForward for T

- \ No newline at end of file +

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

+

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

+

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

+ \ No newline at end of file diff --git a/theme.js b/theme.js deleted file mode 100644 index 8f9c49a4..00000000 --- a/theme.js +++ /dev/null @@ -1 +0,0 @@ -var themes=document.getElementById("theme-choices");var themePicker=document.getElementById("theme-picker");function showThemeButtonState(){themes.style.display="block";themePicker.style.borderBottomRightRadius="0";themePicker.style.borderBottomLeftRadius="0"}function hideThemeButtonState(){themes.style.display="none";themePicker.style.borderBottomRightRadius="3px";themePicker.style.borderBottomLeftRadius="3px"}function switchThemeButtonState(){if(themes.style.display==="block"){hideThemeButtonState()}else{showThemeButtonState()}};function handleThemeButtonsBlur(e){var active=document.activeElement;var related=e.relatedTarget;if(active.id!=="theme-picker"&&(!active.parentNode||active.parentNode.id!=="theme-choices")&&(!related||(related.id!=="theme-picker"&&(!related.parentNode||related.parentNode.id!=="theme-choices")))){hideThemeButtonState()}}themePicker.onclick=switchThemeButtonState;themePicker.onblur=handleThemeButtonsBlur;["ayu","dark","light"].forEach(function(item){var but=document.createElement("button");but.textContent=item;but.onclick=function(el){switchTheme(currentTheme,mainTheme,item,true);useSystemTheme(false)};but.onblur=handleThemeButtonsBlur;themes.appendChild(but)}) \ No newline at end of file