;;; Copyright 2012-2020 Google LLC
;;;
;;; Use of this source code is governed by an MIT-style
;;; license that can be found in the LICENSE file or at
;;; https://opensource.org/licenses/MIT.

(in-package "CL-USER")

(defpackage #:cl-protobufs
  (:use)
  (:export
   ;; Base type for all message instances.
   #:message

   ;; Message field types and related definitions.
   #:int32
   #:int64
   #:uint32
   #:uint64
   #:sint32
   #:sint64
   #:fixed32
   #:fixed64
   #:sfixed32
   #:sfixed64
   #:list-of
   #:vector-of
   #:byte-vector
   #:make-byte-vector

   ;; Enumerations
   #:enum-keywords
   #:enum-int-to-keyword
   #:enum-keyword-to-int

   ;; Serialization to/from various formats

   ;; Binary format
   #:serialize-to-stream
   #:serialize-to-bytes
   #:deserialize-from-stream
   #:deserialize-from-bytes
   #:make-message-with-bytes
   #:set-method-do-not-deserialize-input

   ;; JSON
   #:parse-json
   #:print-json

   ;; Text format - not well specified, prefer json or binary
   #:parse-text-format
   #:print-text-format
   #:fmt

   ;; Descriptors -- descriptors contain all the information parsed from .proto
   ;; files and may be looked up by the symbol naming a protobuf message, enum,
   ;; etc. For most use cases it's not necessary to deal with descriptors
   ;; directly; just access the protos through the generated code APIs and a
   ;; few other generic APIs above. The descriptor APIs are mostly intended for
   ;; writing code that deals with arbitrary protos when the types aren't known
   ;; in advance.

   #:abstract-descriptor
   #:descriptor
   #:enum-descriptor
   #:enum-value-descriptor
   #:extension-descriptor
   #:field-descriptor
   #:file-descriptor
   #:map-descriptor
   #:message-descriptor
   #:method-descriptor
   #:option-descriptor
   #:service-descriptor

   ;; Descriptor lookup
   #:find-enum-descriptor
   #:find-field-descriptor
   #:find-file-descriptor
   #:find-map-descriptor
   #:find-message-descriptor
   #:find-method-descriptor
   #:find-service-descriptor

   ;; descriptor accessors
   #:enum-descriptor-class
   #:enum-descriptor-name
   #:enum-descriptor-values

   ;; The map-* versions are deprecated, to be removed in release 4.0.
   #:proto-key-type    #:map-key-type
   #:proto-value-kind  #:map-value-kind
   #:proto-value-type  #:map-value-type

   #:oneof-descriptor-fields
   #:oneof-descriptor-name
   #:oneof-descriptor-synthetic-p
   #:proto-class
   #:proto-client-stub
   #:proto-container
   #:proto-default
   #:proto-edition
   #:proto-external-field-name
   #:proto-fields
   #:proto-imports
   #:proto-index
   #:proto-input-name
   #:proto-input-streaming-p
   #:proto-input-type
   #:proto-internal-field-name
   #:proto-kind
   #:proto-label
   #:proto-methods
   #:proto-name
   #:proto-oneofs
   #:proto-options
   #:proto-output-name
   #:proto-output-streaming-p
   #:proto-output-type
   #:proto-package-name
   #:proto-qualified-name
   #:proto-server-stub
   #:proto-old-server-stub
   #:proto-service-name
   #:proto-source-location
   #:proto-streams-name
   #:proto-streams-type
   #:proto-type
   #:proto-value

   #:find-option                        ; finds an option, not a descriptor

   ;; Conditions
   #:protobuf-error
   #:unknown-type
   #:unknown-field-type

   ;; Extensions
   #:get-extension
   #:set-extension
   #:has-extension
   #:clear-extension

   ;; The Python "compatibility" API
   #:is-initialized
   #:proto-equal
   #:clear
   #:has-field
   #:proto-slot-value
   #:encoded-field
   #:merge-from

   ;; For RPC stubs
   ;; An RPC library supporting the client functions defined in
   ;; `define-service` should bind these.
   #:*rpc-call-function*
   #:*rpc-streaming-client-function*))

(defpackage #:cl-protobufs.implementation
  (:use :common-lisp :cl-protobufs)
  (:import-from :alexandria #:define-constant)
  (:export
   ;; Exported for use by generated code. These shouldn't be called directly.
   #:define-schema
   #:define-enum
   #:define-map
   #:define-oneof
   #:define-message
   #:define-extend
   #:define-extension
   #:define-service

   #:add-file-descriptor

   ;; TODO(cgay): These should be removed or moved to the interface package, as
   ;; appropriate.
   #:encode-double
   #:encode-string
   #:encode-uint32
   #:make-deserializer
   #:make-serializer
   #:make-tag

   #:serialize-scalar

   ;; For ASDF
   #:validate-imports))
