func()

in wstl1/tools/notebook/extensions/wstl/service/wstlserver/validate.go [40:82]


func (v *Validator) Validate(ctx context.Context, req *wspb.ValidationRequest) (*wspb.ValidationResponse, error) {
	if req == nil || len(req.GetInput()) == 0 {
		return nil, status.Error(codes.InvalidArgument, "no resource provided")
	}
	var version fhirversion.Version
	switch req.GetFhirVersion() {
	case wspb.ValidationRequest_FHIR_VERSION_UNSPECIFIED:
		version = fhirversion.R4
	case wspb.ValidationRequest_R4:
		version = fhirversion.R4
	case wspb.ValidationRequest_STU3:
		version = fhirversion.STU3
	}
	unMar, err := jsonformat.NewUnmarshaller("UTC", version)

	inSrc := req.GetInput()
	var res []*spb.Status
	if err != nil {
		return nil, status.Error(codes.Internal, err.Error())
	}
	for _, src := range inSrc {
		switch s := src.GetLocation().(type) {
		case *wspb.Location_GcsLocation:
			return nil, status.Error(codes.Unimplemented, "GCS source not implemented yet")
		case *wspb.Location_InlineJson:
			_, err := unMar.Unmarshal([]byte(s.InlineJson))
			if err != nil {
				rStatus := status.New(codes.InvalidArgument, "invalid FHIR resource")
				details := status.New(codes.InvalidArgument, err.Error())
				if dStatus, dErr := rStatus.WithDetails(details.Proto()); dErr == nil {
					res = append(res, dStatus.Proto())
				} else {
					res = append(res, rStatus.Proto())
				}
			} else {
				res = append(res, status.New(codes.OK, "Validation Success").Proto())
			}
		default:
			return nil, status.Error(codes.InvalidArgument, "Invalid resource type")
		}
	}
	return &wspb.ValidationResponse{Status: res}, nil
}