aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/go/status.go
diff options
context:
space:
mode:
authorGravatar Jonathan Hseu <jhseu@google.com>2016-08-23 09:01:25 -0800
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2016-08-23 10:04:53 -0700
commit783c52edeb3c676937dbb97ed0d40958015050d6 (patch)
tree80c74954f68dad26a6e76a1c0edcb979d4d1804c /tensorflow/go/status.go
parent096069687c52e16eaa18c1db6e7bbf2737639257 (diff)
Initial version of the Go API. The API is subject to change.
Remaining work to do: - Generated ops. - Generated protocol buffers. - A few calls requiring protocol buffers aren't in this change. Change: 131066649
Diffstat (limited to 'tensorflow/go/status.go')
-rw-r--r--tensorflow/go/status.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/tensorflow/go/status.go b/tensorflow/go/status.go
new file mode 100644
index 0000000000..a1f7ed5481
--- /dev/null
+++ b/tensorflow/go/status.go
@@ -0,0 +1,65 @@
+// Copyright 2016 The TensorFlow Authors. All Rights Reserved.
+//
+// Licensed 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 tensorflow
+
+// #include "tensorflow/c/c_api.h"
+import "C"
+
+import "runtime"
+
+type code C.TF_Code
+
+// status holds error information returned by TensorFlow. We convert all
+// TF statuses to Go errors.
+type status struct {
+ c *C.TF_Status
+}
+
+func newStatus() *status {
+ s := &status{C.TF_NewStatus()}
+ runtime.SetFinalizer(s, (*status).finalizer)
+ return s
+}
+
+func (s *status) finalizer() {
+ C.TF_DeleteStatus(s.c)
+}
+
+func (s *status) Code() code {
+ return code(C.TF_GetCode(s.c))
+}
+
+func (s *status) String() string {
+ return C.GoString(C.TF_Message(s.c))
+}
+
+// Err converts the status to a Go error and returns nil if the status is OK.
+func (s *status) Err() error {
+ if s == nil || s.Code() == C.TF_OK {
+ return nil
+ }
+ return (*statusError)(s)
+}
+
+// statusError is distinct from status because it fulfills the error interface.
+// status itself may have a TF_OK code and is not always considered an error.
+//
+// TODO(jhseu): Make public, rename to Error, and provide a way for users to
+// check status codes.
+type statusError status
+
+func (s *statusError) Error() string {
+ return (*status)(s).String()
+}