/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef NETWERK_BASE_HTTP_SFV_SFV_H_ #define NETWERK_BASE_HTTP_SFV_SFV_H_ #include "mozilla/net/http_sfv_ffi_generated.h" #include "nsStringFwd.h" #include "nsError.h" #include "nsTArray.h" namespace mozilla { namespace net { namespace SFV { struct Token {}; struct SFVString {}; struct Integer {}; struct SFVBool {}; struct Decimal {}; struct ByteSeq {}; template nsresult ParseItem(const nsACString& aInput, nsACString& aOutput); template <> nsresult ParseItem(const nsACString& aInput, nsACString& aOutput); template <> nsresult ParseItem(const nsACString& aInput, nsACString& aOutput); template <> nsresult ParseItem(const nsACString& aInput, nsACString& aOutput); template nsresult ParseItem(const nsACString& aInput, int64_t& aOutput); template <> nsresult ParseItem(const nsACString& aInput, int64_t& aOutput); template nsresult ParseItem(const nsACString& aInput, double& aOutput); template <> nsresult ParseItem(const nsACString& aInput, double& aOutput); template nsresult ParseItem(const nsACString& aInput, bool& aOutput); template <> nsresult ParseItem(const nsACString& aInput, bool& aOutput); class ItemResult { public: explicit ItemResult(SFVItemHandle* aItem); ~ItemResult(); ItemResult(const ItemResult&) = delete; ItemResult& operator=(const ItemResult&) = delete; ItemResult(ItemResult&& aOther) noexcept; ItemResult& operator=(ItemResult&& aOther) noexcept; template nsresult GetValue(nsACString& aOutput) const; template nsresult GetValue(int64_t& aOutput) const; template nsresult GetValue(double& aOutput) const; template nsresult GetValue(bool& aOutput) const; template nsresult GetParam(const nsACString& aKey, nsACString& aOutput) const; template nsresult GetParam(const nsACString& aKey, int64_t& aOutput) const; template nsresult GetParam(const nsACString& aKey, double& aOutput) const; template nsresult GetParam(const nsACString& aKey, bool& aOutput) const; nsresult GetParamKeys(nsTArray& aKeys) const; bool IsValid() const { return mItem != nullptr; } private: SFVItemHandle* mItem; }; ItemResult ParseItemWithParams(const nsACString& aInput); class InnerListResult { public: explicit InnerListResult(SFVInnerListHandle* aInnerList); ~InnerListResult(); InnerListResult(const InnerListResult&) = delete; InnerListResult& operator=(const InnerListResult&) = delete; InnerListResult(InnerListResult&& aOther) noexcept; InnerListResult& operator=(InnerListResult&& aOther) noexcept; size_t Length() const; ItemResult GetItemAt(size_t aIndex) const; bool IsValid() const { return mInnerList != nullptr; } private: SFVInnerListHandle* mInnerList; }; class DictResult { public: explicit DictResult(SFVDictHandle* aDict); ~DictResult(); DictResult(const DictResult&) = delete; DictResult& operator=(const DictResult&) = delete; DictResult(DictResult&& aOther) noexcept; DictResult& operator=(DictResult&& aOther) noexcept; template nsresult GetItem(const nsACString& aKey, nsACString& aOutput) const; template nsresult GetItem(const nsACString& aKey, int64_t& aOutput) const; template nsresult GetItem(const nsACString& aKey, double& aOutput) const; template nsresult GetItem(const nsACString& aKey, bool& aOutput) const; InnerListResult GetInnerList(const nsACString& aKey) const; nsresult GetKeys(nsTArray& aKeys) const; bool IsValid() const { return mDict != nullptr; } private: SFVDictHandle* mDict; }; DictResult ParseDict(const nsACString& aInput); class ListResult { public: explicit ListResult(SFVListHandle* aList); ~ListResult(); ListResult(const ListResult&) = delete; ListResult& operator=(const ListResult&) = delete; ListResult(ListResult&& aOther) noexcept; ListResult& operator=(ListResult&& aOther) noexcept; size_t Length() const; ItemResult GetItemAt(size_t aIndex) const; InnerListResult GetInnerListAt(size_t aIndex) const; bool IsValid() const { return mList != nullptr; } private: SFVListHandle* mList; }; ListResult ParseList(const nsACString& aInput); } // namespace SFV } // namespace net } // namespace mozilla #endif // NETWERK_BASE_HTTP_SFV_SFV_H_