# `MishkaCmsCore.Runtime.Resources.Validations.PublicAddress`
[🔗](https://github.com/mishka-group/mishka_cms_core/blob/v0.0.1/lib/mishka_cms_core/runtime/resources/__validations/public_address.ex#L5)

Refuses a page whose public addresses cannot be what it says, or are already another page's.

  * A page marked as answering every language (`PageProvision.serves_all_languages?/1`) on a path
    that captures no `lang` is refused: only a `lang` capture answers more than one language.
  * An active page is refused when one of its public addresses is one another active page of its
    site already answers at. The refusal names that page — its title and its stored path — and
    the address.

A page's public addresses are `MishkaCmsCore.Runtime.PageEditions.urls/3`'s — a literal page's
one, one per language a page whose only capture is the language answers in — compared as the site
builds them with its primary language unprefixed. Two addresses that are one with a prefix for
every language are one without, so this holds in both URL modes
(`MishkaCmsCore.Runtime.Languages.url_mode/1`), and a site that switches modes finds no page
hidden behind another: while English is the site's first language, `/en/about` and `/about` are
refused together, and so are a literal `/fa/about` and an `/:lang/about` answering Persian. A
pattern with any other capture is the template of many addresses, left to the resolver's
precedence — `/post/new` before `/post/:slug`.

Asked when the path, the language, `extra` or `active` changes, before the write and with the
actor and the authorization the action runs with. The second refusal carries the address in its
`vars` as `:answered_at`, which is how `MishkaCmsCore.Runtime.PageProvision.create/2` tells it
from any other and leaves the page out of a run instead of raising.

    validate {MishkaCmsCore.Runtime.Resources.Validations.PublicAddress, []},
      before_action?: true

---

*Consult [api-reference.md](api-reference.md) for complete listing*
