Name.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Sergey Bugaev <bugaevc@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/ByteString.h>
  9. #include <AK/Forward.h>
  10. namespace DNS {
  11. class Name {
  12. public:
  13. Name() = default;
  14. Name(ByteString const&);
  15. static ErrorOr<Name> parse(ReadonlyBytes data, size_t& offset, size_t recursion_level = 0);
  16. size_t serialized_size() const;
  17. ByteString const& as_string() const { return m_name; }
  18. ErrorOr<void> write_to_stream(Stream&) const;
  19. void randomize_case();
  20. bool operator==(Name const& other) const { return Traits::equals(*this, other); }
  21. class Traits : public AK::Traits<Name> {
  22. public:
  23. static unsigned hash(Name const& name);
  24. static bool equals(Name const&, Name const&);
  25. };
  26. private:
  27. ByteString m_name;
  28. };
  29. }
  30. template<>
  31. struct AK::Formatter<DNS::Name> : Formatter<StringView> {
  32. ErrorOr<void> format(FormatBuilder& builder, DNS::Name const& value)
  33. {
  34. return Formatter<StringView>::format(builder, value.as_string());
  35. }
  36. };