見出し画像

TWSNMP MW開発7日目:Solid.jsの開発に慣れてきたがWails v3の問題に悩まされる

今朝は6時まで寝てしまいました。目を覚ますと眼の前に助手の猫さんの顔がありました。しばらく、黙っていましたが、起きなさいと言って先導されました。

Solid.jsによる開発には少し慣れてきました。考えている画面の動きを、なんとか作れるようなってきました。快調かと思ったらWails v3の問題に遭遇しました。見つけた問題は2つです。

1つ目はGO言語側の関数が

func (t *Twsnmp) GetSites() []Site {
	ret := []Site{}
	t.Sites.Range(func(k, v any) bool {
		if s, ok := v.(Site); ok {
			ret = append(ret, s)
		}
		return true
	})
	return ret
}

の用な感じにして登録したSIteの配列を返そうとすると、JavaScript側の関数定義が、

export async function GetSites() : Promise<Site> {
	return Call.ByName("main.Twsnmp.GetSites");
}

のように配列じゃない型を返すようになっている問題です。
あまり、美しくないですが

    const l = await GetSites() as any;
    setSites(l)

のようにanyに型変換すれば、エラーはなくなって、データをも受け取れるので、これの方法で回避しておきました。

もう一つは、JavaScript側からstructのパラメータをGO言語側の関数に渡そうとすると発生するエラーです。VSCodeにはエラーが表示されないですが、実行した時にエラーが発生します。
GO言語側が

func (t *Twsnmp) UpdateSite(s Site) {
	if s.Id == "" {
		s.Id = fmt.Sprintf("%x", time.Now().UnixNano())
		s.State = "unknown"
	}
	t.Sites.Store(s.Id, s)
}

の関数をJavaScipt側から

await UpdateSite(site);

のように呼んだ時に発生します。
こちらは、いろいろ試した結果、

func (t *Twsnmp) UpdateSite(id, name, url, user, password string) {

のように、structでまとめて渡すのはやめて、stringを沢山ならべて回避しました。
どちらの問題も、wails v3のIssuesに報告されているようなので、修正されると思います。

なんとか、TWSNMP FCを登録してリスト表示するところまでできました。

左端の状態のアイコンは、Solid.jsのコンポーネントを作っていい感じに表示できています。少し開発のコツを掴んだ気がして嬉しいです。
(状態はテスト用のダミーです。)

昨日、TWSNMP FCのフィードバックがありましたが、その回答は

です。

明日に続く


開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。