aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/old/vlib/context/value.v
blob: 19a2289207ee8898cb26f82e8752a589ae785203 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// This module defines the Context type, which carries deadlines, cancellation signals,
// and other request-scoped values across API boundaries and between processes.
// Based off:   https://github.com/golang/go/tree/master/src/context
// Last commit: https://github.com/golang/go/commit/52bf14e0e8bdcd73f1ddfb0c4a1d0200097d3ba2
module context

import time

// A ValueContext carries a key-value pair. It implements Value for that key and
// delegates all other calls to the embedded Context.
pub struct ValueContext {
	key   string
	value voidptr
mut:
	context Context
}

// with_value returns a copy of parent in which the value associated with key is
// val.
//
// Use context Values only for request-scoped data that transits processes and
// APIs, not for passing optional parameters to functions.
//
// The provided key must be comparable and should not be of type
// string or any other built-in type to avoid collisions between
// packages using context. Users of with_value should define their own
// types for keys
pub fn with_value(parent Context, key string, value voidptr) Context {
	return &ValueContext{
		context: parent
		key: key
		value: value
	}
}

pub fn (ctx ValueContext) deadline() ?time.Time {
	return ctx.context.deadline()
}

pub fn (ctx ValueContext) done() chan int {
	return ctx.context.done()
}

pub fn (ctx ValueContext) err() IError {
	return ctx.context.err()
}

pub fn (ctx ValueContext) value(key string) ?voidptr {
	if ctx.key == key {
		return ctx.value
	}
	return ctx.context.value(key)
}

pub fn (ctx ValueContext) str() string {
	return context_name(ctx.context) + '.with_value'
}