proto-shell: move all proto init code to a separate function
[project/netifd.git] / dummy / netifd-proto.sh
1 . /usr/share/libubox/jshn.sh
2
3 proto_config_add_generic() {
4         json_add_array ""
5         json_add_string "" "$1"
6         json_add_int "" "$2"
7         json_close_array
8 }
9
10 proto_config_add_int() {
11         proto_config_add_generic "$1" 5
12 }
13
14 proto_config_add_string() {
15         proto_config_add_generic "$1" 3
16 }
17
18 proto_config_add_boolean() {
19         proto_config_add_generic "$1" 7
20 }
21
22 add_default_handler() {
23         case "$(type $1 2>/dev/null)" in
24                 *function*) return;;
25                 *) eval "$1() { return; }"
26         esac
27 }
28
29 _proto_do_teardown() {
30         json_load "$data"
31         eval "$1_teardown \"$interface\" \"$ifname\""
32 }
33
34 _proto_do_setup() {
35         json_load "$data"
36         eval "$1_setup \"$interface\" \"$ifname\""
37 }
38
39 init_proto() {
40         proto="$1"; shift
41         cmd="$1"; shift
42
43         case "$cmd" in
44                 dump)
45                         add_protocol() {
46                                 no_device=0
47                                 available=0
48
49                                 add_default_handler "$1_init_config"
50
51                                 json_init
52                                 json_add_string "name" "$1"
53                                 eval "$1_init"
54                                 json_add_boolean no-device "$no_device"
55                                 json_add_boolean available "$available"
56                                 json_add_array "config"
57                                 eval "$1_init_config"
58                                 json_close_array
59                                 json_dump
60                         }
61                 ;;
62                 setup|teardown)
63                         interface="$1"; shift
64                         data="$1"; shift
65                         ifname="$1"; shift
66
67                         add_protocol() {
68                                 [[ "$proto" == "$1" ]] || return 0
69
70                                 case "$cmd" in
71                                         setup) _proto_do_setup "$1";;
72                                         teardown) _proto_do_teardown "$1" ;;
73                                         *) return 1 ;;
74                                 esac
75                         }
76                 ;;
77         esac
78 }