// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

package datastore

import "encoding/json"

// JSONCodec implement Codec interface with JSON encoding
type JSONCodec struct{}

// NewJSONCodec creates a new JSON Codec
func NewJSONCodec() Codec {
	return &JSONCodec{}
}

// Marshal with JSON encoding
func (s *JSONCodec) Marshal(v interface{}) ([]byte, error) {
	return json.Marshal(v)
}

// Unmarshal with JSON encoding
func (s *JSONCodec) Unmarshal(b []byte, v interface{}) error {
	return json.Unmarshal(b, v)
}
