// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package fs

import (
	"v.io/v23/naming"
	"v.io/v23/security"
	"v.io/v23/services/application"
)

// TP is a convenience function. It prepends the transactionNamePrefix
// to the given path.
func TP(path string) string {
	return naming.Join(transactionNamePrefix, path)
}

func (ms *Memstore) PersistedFile() string {
	return ms.persistedFile
}

func translateToGobEncodeable(in interface{}) interface{} {
	env, ok := in.(application.Envelope)
	if !ok {
		return in
	}
	return applicationEnvelope{
		Title:     env.Title,
		Args:      env.Args,
		Binary:    env.Binary,
		Publisher: security.MarshalBlessings(env.Publisher),
		Env:       env.Env,
		Packages:  env.Packages,
	}
}

func (ms *Memstore) GetGOBConvertedMemstore() map[string]interface{} {
	convertedMap := make(map[string]interface{})
	for k, v := range ms.data {
		switch tv := v.(type) {
		case application.Envelope:
			convertedMap[k] = translateToGobEncodeable(tv)
		}
	}
	return convertedMap
}
