go run . > output.png
-
-
Save owulveryck/ae042077a74102f5bf61e3b1cdff24b4 to your computer and use it in GitHub Desktop.
package main | |
import ( | |
"bytes" | |
"fmt" | |
_ "image/jpeg" | |
_ "image/png" | |
"io" | |
"log" | |
"os" | |
"text/template" | |
"time" | |
"github.com/skip2/go-qrcode" | |
) | |
func main() { | |
a := &Authorization{ | |
CreateDate: myTime{time.Now()}, | |
Name: "Doe", | |
FirstName: "John", | |
BirthDate: myTime{time.Now()}, | |
BirthCity: "Paris", | |
Address: "1 rue de Paris 75000 Paris", | |
AuthorizationDate: myTime{time.Now()}, | |
Purpose: "demarche", | |
} | |
err := a.Png(os.Stdout) | |
if err != nil { | |
log.Fatal(err) | |
} | |
} | |
type Authorization struct { | |
CreateDate myTime | |
Name string | |
FirstName string | |
BirthDate myTime | |
BirthCity string | |
Address string | |
AuthorizationDate myTime | |
/* Purpose is one of | |
"travail" | |
"sante" | |
"famille" | |
"handicap" | |
"judiciaire" | |
"missions" | |
"transit" | |
"animaux" | |
"courses" | |
"sport" | |
"rassemblement" | |
"demarche" | |
// source https://gitlab.inria.fr/stopcovid19/stopcovid-android/-/blob/master/stopcovid/src/main/assets/Attestations/form.json | |
*/ | |
Purpose string | |
} | |
const tmpl = `Cree le: {{ .CreateDate.Date }} a {{ .CreateDate.HourMinute }}; | |
Nom: {{ .Name }}; | |
Prenom: {{ .FirstName }}; | |
Naissance: {{ .BirthDate.Date }} a {{ .BirthCity }}; | |
Adresse: {{ .Address }}; | |
Sortie: {{ .AuthorizationDate.Date }} a {{ .AuthorizationDate.HourMinute }}; | |
Motifs: {{ .Purpose }}` | |
func (a *Authorization) String() string { | |
var b bytes.Buffer | |
t := template.Must(template.New("attestation").Parse(tmpl)) | |
err := t.Execute(&b, a) | |
if err != nil { | |
panic(err) | |
} | |
return b.String() | |
} | |
func (a *Authorization) Png(w io.Writer) error { | |
qrCode, err := qrcode.New(a.String(), qrcode.Medium) | |
if err != nil { | |
return err | |
} | |
return qrCode.Write(256, w) | |
} | |
type myTime struct { | |
time.Time | |
} | |
var months = [...]string{ | |
"janvier", | |
"fevrier", | |
"mars", | |
"avri", | |
"mai", | |
"juin", | |
"juillet", | |
"aout", | |
"septembre", | |
"octobre", | |
"novembre", | |
"decembre", | |
} | |
func (m myTime) Date() string { | |
return fmt.Sprintf("%v %v %v", m.Format("02"), months[m.Month()-1], m.Format("2006")) | |
} | |
func (m myTime) HourMinute() string { | |
return m.Format("15:04") | |
} |
package main | |
import ( | |
_ "image/jpeg" | |
_ "image/png" | |
"testing" | |
"time" | |
) | |
func TestAuthorization_String(t *testing.T) { | |
const longForm = "Jan 2, 2006 at 3:04pm (MST)" | |
testTime, _ := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)") | |
type fields struct { | |
CreateDate myTime | |
Name string | |
FirstName string | |
BirthDate myTime | |
BirthCity string | |
Address string | |
AuthorizationDate myTime | |
Purpose string | |
} | |
tests := []struct { | |
name string | |
fields fields | |
want string | |
}{ | |
{ | |
"simple", | |
fields{ | |
CreateDate: myTime{testTime}, | |
BirthDate: myTime{testTime}, | |
AuthorizationDate: myTime{testTime}, | |
}, | |
`Cree le: 03 fevrier 2013 a 19:54; | |
Nom: ; | |
Prenom: ; | |
Naissance: 03 fevrier 2013 a ; | |
Adresse: ; | |
Sortie: 03 fevrier 2013 a 19:54; | |
Motifs: `, | |
}, | |
} | |
for _, tt := range tests { | |
t.Run(tt.name, func(t *testing.T) { | |
a := &Authorization{ | |
CreateDate: tt.fields.CreateDate, | |
Name: tt.fields.Name, | |
FirstName: tt.fields.FirstName, | |
BirthDate: tt.fields.BirthDate, | |
BirthCity: tt.fields.BirthCity, | |
Address: tt.fields.Address, | |
AuthorizationDate: tt.fields.AuthorizationDate, | |
Purpose: tt.fields.Purpose, | |
} | |
got := a.String() | |
if got != tt.want { | |
t.Errorf("Authorization.String() = %v, want %v", got, tt.want) | |
} | |
}) | |
} | |
} |
Voici ce que j'ai quand j'exécute : ./maintest.go:14:20: undefined: myTime
./maintest.go:17:21: undefined: myTime
./maintest.go:20:21: undefined: myTime
./maintest.go:31:24: undefined: myTime
./maintest.go:32:24: undefined: myTime
./maintest.go:33:24: undefined: myTime
Que faut-il faire?
Hello @carlito79,
Quelle ligne de commande executes-tu ?
Hello @owuveryck,
Que faut-il lancer exactement pour exécuter ce générateur de QR code ?
sachant que j'ai téléchargé le zip sur mon PC (sous Windows 10) et que les fichiers sont maintenant "associés" au bloc-notes/notepad
Merci de ton aide
Hello @owuveryck , j'ai bien entré la commande go run . > output.png
après avoir cloné le dépôt, sauf que j'obtiens ce message :
main.go:14:2: cannot find package "go-qrcode" in any of: /usr/lib/go-1.13/src/go-qrcode (from $GOROOT) /home/elodie/go/src/go-qrcode (from $GOPATH)
Faut il récupérer manuellement le github.com/skip2/go-qrcode ? ou autre chose avant l'exécution ? :)
Bonjour,
Avant, il faut faire: go get -u github.com/skip2/go-qrcode/...
Florent
super merci @Flodu31 :)
Bonjour tout le monde,
Je suis novice en la matière, je souhaiterai savoir la procédure pour exécuter ce code.
J'ai installer : go version go1.16.7 windows/amd64
J'ai exécuter avec cmd : go get -u github.com/skip2/go-qrcode/...
Dans le GOPATH je retrouve bien le pkg
J'ai mis les 3 fichiers main.go ; main_test.go et AAA README.md dans un dossier sur mon bureau
Ensuite je bloque, comment exécuter le code ? j'ai essayé plusieurs commandes en pointant dans le dossier sur mon bureau, je n'y arrive pas.
Merci pour votre aide.
Cordialement.
bonjour Olivier j'ai essayé Twitter mais impossible d'envoyer un message car il n'y a pas l'icône enveloppe sur ton profil, je voulais savoir si ce projet est toujours d'actualité...
si tu peux, reponds moi sur Twitter en MP
@Pchaibriant
Merci
@owulveryck
Hello @pcm-x je réponds ici c'est plus simple et tout le monde verra la réponse.
Ce "bout de code" était utile au moment ou il était nécessaire d'avoir des attestations dérogatoires pour se déplacer.
Je ne voulais pas utiliser tous-anti-covid pour ça, et ce code permettait de générer le QR code automatiquement. Il était "legal" car il reposait sur une attestation sur l'honneur.
Je vois beaucoup de gens qui s'intéressent à ce gist récemment. Ce code ne sera pas maintenu car nous n'avons plus besoin d'attestation de déplacement désormais.
Pour info, il n'a pas vocation à générer les certificats de passes-sanitaires.
Merci pour ta réponse, effectivement en voyant les fichiers je me demandais si on allait avoir droit à un autre QR code/autorisation de sortie à remplir en plus du pass sanitaire....
Ce qui était pas mal inquiétant !
Bonne journée
Coucou, tout p'tit soucis, l22 : birthdate != AuthorizationDate : moyen de faire un truc comme çà
myTime{time.Date(1942, 6, 7, 0, 42, 0, 0, time.UTC)},